Files
nexus/sreweekly/articles/16/06-what-does-etsy-s-architecture-look-like-today.html
2026-09-12 17:23:01 +08:00

534 lines
39 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<title>What does Etsy&#x27;s architecture look like today? - High Scalability -</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preload" as="style" href="https://highscalability.com/assets/built/screen.css?v=QpNBjlSbNzyRyl6s">
<link rel="preload" as="script" href="https://highscalability.com/assets/built/source.js?v=uMULaSMoSjM4gY5C">
<link rel="preload" as="font" type="font/woff2" href="https://highscalability.com/assets/fonts/inter-roman.woff2?v=OecsB5TBLy27FKD2" crossorigin="anonymous">
<style>
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 100 900;
font-display: optional;
src: url(https://highscalability.com/assets/fonts/inter-roman.woff2?v=OecsB5TBLy27FKD2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
</style>
<link rel="stylesheet" type="text/css" href="https://highscalability.com/assets/built/screen.css?v=QpNBjlSbNzyRyl6s">
<style>
:root {
--background-color: #ffffff
}
</style>
<script>
/* The script for calculating the color contrast has been taken from
https://gomakethings.com/dynamically-changing-the-text-color-based-on-background-color-contrast-with-vanilla-js/ */
var accentColor = getComputedStyle(document.documentElement).getPropertyValue('--background-color');
accentColor = accentColor.trim().slice(1);
if (accentColor.length === 3) {
accentColor = accentColor[0] + accentColor[0] + accentColor[1] + accentColor[1] + accentColor[2] + accentColor[2];
}
var r = parseInt(accentColor.substr(0, 2), 16);
var g = parseInt(accentColor.substr(2, 2), 16);
var b = parseInt(accentColor.substr(4, 2), 16);
var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
var textColor = (yiq >= 128) ? 'dark' : 'light';
document.documentElement.className = `has-${textColor}-text`;
</script>
<link rel="canonical" href="https://highscalability.com/what-does-etsys-architecture-look-like-today/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="High Scalability">
<meta property="og:type" content="article">
<meta property="og:title" content="What does Etsy&#x27;s architecture look like today? - High Scalability -">
<meta property="og:description" content="This is a guest post by Christophe Limpalair based on an interview ( video ) he did with Jon ...">
<meta property="og:url" content="https://highscalability.com/what-does-etsys-architecture-look-like-today/">
<meta property="og:image" content="http://farm8.staticflickr.com/7147/6641389973_9bc54761bf_m.jpg">
<meta property="article:published_time" content="2016-03-23T15:56:30.000Z">
<meta property="article:modified_time" content="2016-03-23T15:56:30.000Z">
<meta property="article:tag" content="Example">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="What does Etsy&#x27;s architecture look like today? - High Scalability -">
<meta name="twitter:description" content="This is a guest post by Christophe Limpalair based on an interview (video) he did with Jon Cowie, Staff Operations Engineer and Breaksmith @ Etsy.
Etsy has been a fascinating platform to watch, and study, as they transitioned from a new platform to a stable and well-established e-commerce engine.">
<meta name="twitter:url" content="https://highscalability.com/what-does-etsys-architecture-look-like-today/">
<meta name="twitter:image" content="https://static.ghost.org/v5.0.0/images/publication-cover.jpg">
<meta name="twitter:label1" content="Written by">
<meta name="twitter:data1" content="High Scalability">
<meta name="twitter:label2" content="Filed under">
<meta name="twitter:data2" content="Example">
<meta name="twitter:site" content="@ghost">
<meta name="twitter:creator" content="@highscal">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"publisher": {
"@type": "Organization",
"name": "High Scalability",
"url": "https://highscalability.com/",
"logo": {
"@type": "ImageObject",
"url": "https://highscalability.com/favicon.ico",
"width": 48,
"height": 48
}
},
"author": {
"@type": "Person",
"name": "High Scalability",
"image": {
"@type": "ImageObject",
"url": "https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/2024/03/hs.jpeg",
"width": 400,
"height": 400
},
"url": "https://highscalability.com/author/hs/",
"sameAs": [
"https://blog.bytebytego.com/",
"https://x.com/highscal"
]
},
"headline": "What does Etsy's architecture look like today? - High Scalability -",
"url": "https://highscalability.com/what-does-etsys-architecture-look-like-today/",
"datePublished": "2016-03-23T15:56:30.000Z",
"dateModified": "2016-03-23T15:56:30.000Z",
"keywords": "Example",
"description": "This is a guest post by Christophe Limpalair based on an interview (video) he did with Jon Cowie, Staff Operations Engineer and Breaksmith @ Etsy.\n\nEtsy has been a fascinating platform to watch, and study, as they transitioned from a new platform to a stable and well-established e-commerce engine. That shift required a lot of cultural change, but the end result is striking.\n\nIn case you haven't seen it already, there's a post from 2012 that outlines their growth and shift. But what has happened ",
"mainEntityOfPage": "https://highscalability.com/what-does-etsys-architecture-look-like-today/"
}
</script>
<meta name="generator" content="Ghost 6.64">
<link rel="alternate" type="application/rss+xml" title="High Scalability" href="https://highscalability.com/rss/">
<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://highscalability.com/" data-key="e7388272b3fcb33a0abfc2f95c" data-api="https://high-scalability.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script><style id="gh-members-styles">.gh-post-upgrade-cta-content,
.gh-post-upgrade-cta {
display: flex;
flex-direction: column;
align-items: center;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
text-align: center;
width: 100%;
color: #ffffff;
font-size: 16px;
}
.gh-post-upgrade-cta-content {
border-radius: 8px;
padding: 40px 4vw;
}
.gh-post-upgrade-cta h2 {
color: #ffffff;
font-size: 28px;
letter-spacing: -0.2px;
margin: 0;
padding: 0;
}
.gh-post-upgrade-cta p {
margin: 20px 0 0;
padding: 0;
}
.gh-post-upgrade-cta small {
font-size: 16px;
letter-spacing: -0.2px;
}
.gh-post-upgrade-cta a {
color: #ffffff;
cursor: pointer;
font-weight: 500;
box-shadow: none;
text-decoration: underline;
}
.gh-post-upgrade-cta a:hover {
color: #ffffff;
opacity: 0.8;
box-shadow: none;
text-decoration: underline;
}
.gh-post-upgrade-cta a.gh-btn {
display: block;
background: #ffffff;
text-decoration: none;
margin: 28px 0 0;
padding: 8px 18px;
border-radius: 4px;
font-size: 16px;
font-weight: 600;
}
.gh-post-upgrade-cta a.gh-btn:hover {
opacity: 0.92;
}</style>
<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="e7388272b3fcb33a0abfc2f95c" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://high-scalability.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
<link href="https://highscalability.com/webmentions/receive/" rel="webmention">
<script defer src="/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
<link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=WwnU9jw5ancNC8Gc">
<script defer src="/public/comment-counts.min.js?v=oFYkaGLdiMqB8VN9" data-ghost-comments-counts-api="https://highscalability.com/members/api/comments/counts/"></script>
<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://highscalability.com/.ghost/analytics/api/v1/page_hit" tb_site_uuid="647204cd-7ad2-4539-b98a-3489074b932d" tb_post_uuid="2b2c6cc4-6f6e-4142-8cfd-2db0a46fcb4f" tb_post_type="post" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script><style>:root {--ghost-accent-color: #35cea0;}</style>
<!-- Fathom - beautiful, simple website analytics -->
<script src="https://cdn.usefathom.com/script.js" data-site="XBRJSZNU" defer></script>
<!-- / Fathom -->
<style>
/* Hide feature image on single post page in Source theme */
.post-template .gh-article-image {
display: none;
}
.gh-footer-copyright { display: none; }
</style>
</head>
<body class="post-template tag-example tag-hash-sqs has-sans-title has-sans-body">
<div class="gh-viewport">
<header id="gh-navigation" class="gh-navigation is-middle-logo gh-outer">
<div class="gh-navigation-inner gh-inner">
<div class="gh-navigation-brand">
<a class="gh-navigation-logo is-title" href="https://highscalability.com">
High Scalability
</a>
<button class="gh-search gh-icon-button" aria-label="Search this site" data-ghost-search>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg></button> <button class="gh-burger gh-icon-button" aria-label="Menu">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256"><path d="M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"></path></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path></svg> </button>
</div>
<nav class="gh-navigation-menu">
<ul class="nav">
<li class="nav-home"><a href="https://highscalability.com/">Home</a></li>
<li class="nav-system-design-interview-course"><a href="https://bit.ly/hishscalcourse">System Design Interview Course</a></li>
</ul>
</nav>
<div class="gh-navigation-actions">
<button class="gh-search gh-icon-button" aria-label="Search this site" data-ghost-search>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg></button> <div class="gh-navigation-members">
<a href="#/portal/signin" data-portal="signin">Sign in</a>
<a class="gh-button" href="#/portal/signup" data-portal="signup">Subscribe</a>
</div>
</div>
</div>
</header>
<main class="gh-main">
<article class="gh-article post tag-example tag-hash-sqs no-image">
<header class="gh-article-header gh-canvas">
<a class="gh-article-tag" href="https://highscalability.com/tag/example/">Example</a>
<h1 class="gh-article-title is-title">What does Etsy&#x27;s architecture look like today?</h1>
<div class="gh-meta-share">
<div class="gh-article-meta">
<div class="gh-article-author-image instapaper_ignore">
<a href="/author/hs/">
<img class="author-profile-image" src="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w160/2024/03/hs.jpeg" alt="High Scalability">
</a>
</div>
<div class="gh-article-meta-wrapper">
<h4 class="gh-article-author-name"><a href="/author/hs/">High Scalability</a></h4>
<div class="gh-article-meta-content">
<time class="gh-article-meta-date" datetime="2016-03-23">23 Mar 2016</time>
<span class="gh-article-meta-length"><span class="bull">—</span> 6 min read</span>
</div>
</div>
</div>
<a href="#/share" class="gh-button gh-button-share">
Share
</a>
</div>
</header>
<section class="gh-content gh-canvas is-body">
<figure class="kg-card kg-image-card"><img src="http://farm8.staticflickr.com/7147/6641389973_9bc54761bf_m.jpg" class="kg-image" alt loading="lazy" width="200" height="150"></figure><p><em>This is a guest post by <a href="https://twitter.com/ScaleYourCode?ref=highscalability.com">Christophe Limpalair</a> based on an <a href="https://scaleyourcode.com/interviews/interview/25?ref=highscalability.com">interview</a> (<a href="https://www.youtube.com/watch?v=3vV4YiqKm1o&ref=highscalability.com">video</a>) he did with <a href="https://twitter.com/jonlives?ref=highscalability.com">Jon Cowie</a>, Staff Operations Engineer and Breaksmith @ Etsy.</em></p><p>Etsy has been a fascinating platform to watch, and study, as they transitioned from a new platform to a stable and well-established e-commerce engine. That shift required a lot of cultural change, but the end result is striking.</p><p>In case you haven't seen it already, there's a <a href="https://highscalability.com/the-etsy-saga-from-silos-to-happy-to-billions-of-pageviews-a/">post from 2012</a> that outlines their growth and shift. But what has happened since then? Are they still innovating? How are engineering decisions made, and how does this shape their engineering culture? These are questions we explored with Jon Cowie, a Staff Operations Engineer at Etsy, and the author of Customizing Chef, in a new podcast episode.</p><h2 id="what-does-etsy-s-architecture-look-like-nowadays">What does Etsy's architecture look like nowadays?</h2><p>Their architecture hasn't really changed all that much since the last update dating back to 2012 (in the previously mentioned post). While this might sound boring to some, it outlines an important concept, and it gives us some insight into Etsy's engineering culture. We'll refer back to this culture throughout the post, but here's their general architecture:</p><p>Etsy's production infrastructure is all bare metal. When it comes to development, however, they virtualize environments. That gives every developer a virtual machine which represents a microcosm of the entire stack. At the end of the day, the virtual environments still run on Etsy's own physical hardware.</p><p>The actual stack itself still looks like this:</p><ul><li>Linux</li><li>Apache</li><li>MySQL</li><li>PHP</li><li>Caching layers</li><li>F5 load balancers</li></ul><p>They have a number of different caching layers with different jobs. They use memcached pretty heavily for caching database objects.</p><p>Etsy has public-facing APIs for third-party developers, and they also have internal APIs. There are caching layers for these APIs, since some of the answers aren't short lived. For example, if an answer lives for an hour or more, they might cache it.</p><p>Of course, they cache images and static assets pretty heavily as well.</p><p>The challenge here is cache invalidation. Making sure that you're not serving stale content to users, but leveraging caching enough to reduce the load on your database as much as possible. Also, making sure that you're serving responses faster to users by having it cached and closer to the end-user. This is something else the Etsy teams care deeply about, as made evident with the regular performance reports on their engineering blog, CodeasCraft.com.</p><p>While the overall architecture is pretty much the same, it certainly doesn't mean the Etsy engineers and Ops teams have just sat there twiddling their thumbs this whole time. Well, maybe some of them have, but I digress...</p><h2 id="so-what-are-their-ops-challenges-do-they-still-have-to-put-out-fires">So what are their ops challenges? Do they still have to put out fires?</h2><p>We just saw how they tend to err on the side of mature and proven technology, so they don't spend too much time putting out fires. New problems tend to come from introducing new systems. I'm sure many of you reading have been through this before: you introduce a new system that, on paper, will solve all of your problems. Except it has a complex and 'impossible' reaction to other components currently in your environment. So you have to figure out what's causing the issue and how to solve it.</p><p>Which, honestly, if you're in this field, you probably live for these moments. These are the interesting challenges that make you scratch your head and you really want to figure out so you can move on to the next challenge. Except sometimes it just takes too long, and then it becomes a nuisance.</p><p>Another challenge that most companies have, is trying to hire great talent. Where do you even find great talent? If you're using the new 'hotness', chances are you will have a harder time finding that talent, and it will be a lot more expensive. If you pick something mature like PHP, though, it's not quite as difficult. Still hard, but not as hard as finding someone for, say, Scala.</p><p>A lot of PHP tooling has been around for a decade at this point, and so has the language. Many of the bleeding edge bugs have been ironed out. That means fewer weird bugs that are hard to figure out, and more experts to hire.</p><h2 id="does-that-mean-they-never-change-anything-in-their-architecture">Does that mean they never change anything in their architecture?</h2><p>No, definitely not. All it means is that they have a well-defined process for making decisions to use new technologies.</p><p>They actually use a tool to create "architecture reviews", where the proponent inputs supporting materials and the theory behind the idea. Then, a team will come up with a concept that they believe will fit in with Etsy's current environment.</p><p>Let's take a look at a recent example. They've introduced Kafka for event pipelining. In order to do that, a team came up with a use case for why they should use Kafka, and how it would solve a real problem at Etsy. Then, they set up an architecture review where senior engineers and all the relevant parties gather to talk about the proposal.</p><p>Is it a mature and proven-enough technology?</p><p>Will it actually solve the issue, and is it the best way to solve the issue?</p><p>How will the component react with our systems?</p><p>Who's going to support this?</p><p>Once these kinds of questions are answered, they move on to the implementing stage.</p><p>Before going live, it has to go through another process called "operability review", which verifies that everything is in place. This includes setting up the proper monitoring and alerting, setting up the proper procedures for everyone on-call, and so forth. Everyone that has something to do with this implementation must be on board with the 'what, when, how'.</p><p>Another important consideration is, "can we do this by building it on a tool we already have?" We'll get to that in more detail in just a moment.</p><p>These are the kinds of questions they must answer before implementing a proposed technology. This kind of thorough analysis might take time, but for an established e-commerce platform, uptime is gold.</p><p>"We take our uptime, reliability, and general operability of the site very seriously."</p><h2 id="customizing">Customizing</h2><p>We've already seen how Etsy's culture encourages stability. What we haven't discussed yet is how it encourages customizing existing tools.</p><p>As we just saw, instead of implementing a new tool to solve a problem, it sometimes makes more sense to customize a tool already in-use. A prime example of this is customizing Chef. Jon Cowie has been part of some impactful Chef customizations, like <a href="https://github.com/jonlives/knife-spork?ref=highscalability.com">Knife-spork</a>. This customization actually came from an issue the Etsy team was trying to solve. When multiple developers contributed changes to the same Chef Server and repository at the same time, changes would get overwritten. Jon led the charge on this tool, and not only helped a large open source community, but also solved a critical and limiting issue at Etsy.</p><p>This is part of what inspired Jon to write <a href="http://shop.oreilly.com/product/0636920032984.do?ref=highscalability.com">Customizing Chef</a>. It's the book he wishes he would have had.</p><p>It's also a great example of Chef's open source culture as well. Jon stressed the point that Chef isn't designed to be a "one size fits all" solution. It's designed to give people a toolkit that lets us solve our own automation problems. Chef has this idea that the users are the experts of their own systems. While it can't tell you what to do, it gives you the tools so you can make those decisions for yourself and then tell it what you want.</p><p>Of course, this isn't to say that customization doesn't have its own problems. If you customize something, you have to "own it". It gets even more complicated once you decide to open source that tool or customization. In fact, Etsy had an issue with this early on after they decided to open source tools. They would open source the tool, but then engineers would pull down a version locally, edit it for the Etsy infrastructure, and then never push it back to the main repository. A lot of projects just weren't being updated.</p><p>How did they fix it? By having a procedure in place. Much like with wanting to introduce a new technology in the system, if you want to open source a project at Etsy, you need to answer a few questions about the project and how it will be maintained.</p><p>A lot of it is also admitting which projects just aren't going to be maintained anymore. They ended up going through various projects and making it clear that they weren't being updated anymore. That allows them to regroup and focus on the tools they really use internally.</p><p>"So the process we've put into place is much more geared to making sure that we only open source things we are ourselves actively using in production."</p><p>Because at the end of the day, if no one is going to maintain a tool, it's probably not going to help the community a whole lot.</p><h2 id="what-about-you">What about you?</h2><p>How different is your process and thinking? Have you learned anything from the way Etsy does it? What about from their engineering culture and open source practices?</p><p><a href="https://news.ycombinator.com/item?id=11345723&ref=highscalability.com">On HackerNews</a></p>
</section>
</article>
<div class="gh-comments gh-canvas">
<script defer src="https://cdn.jsdelivr.net/ghost/comments-ui@~1.6/umd/comments-ui.min.js" data-locale="en" data-ghost-comments="https://highscalability.com/" data-api="https://high-scalability.ghost.io/ghost/api/content/" data-admin="https://high-scalability.ghost.io/ghost/" data-key="e7388272b3fcb33a0abfc2f95c" data-title="null" data-count="true" data-post-id="65bceaca395398000165994c" data-color-scheme="auto" data-avatar-saturation="60" data-accent-color="#35cea0" data-comments-enabled="all" data-publication="High Scalability" crossorigin="anonymous"></script>
</div>
</main>
<section class="gh-container is-grid gh-outer">
<div class="gh-container-inner gh-inner">
<h2 class="gh-container-title">Read more</h2>
<div class="gh-feed">
<article class="gh-card post">
<a class="gh-card-link" href="/untitled-2/">
<figure class="gh-card-image">
<img
srcset="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w160/format/webp/2024/05/pasted-image-0-2.png 160w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w320/format/webp/2024/05/pasted-image-0-2.png 320w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/format/webp/2024/05/pasted-image-0-2.png 600w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w960/format/webp/2024/05/pasted-image-0-2.png 960w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w1200/format/webp/2024/05/pasted-image-0-2.png 1200w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w2000/format/webp/2024/05/pasted-image-0-2.png 2000w"
sizes="320px"
src="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/2024/05/pasted-image-0-2.png"
alt="Kafka 101"
loading="lazy"
>
</figure>
<div class="gh-card-wrapper">
<h3 class="gh-card-title is-title">Kafka 101</h3>
<p class="gh-card-excerpt is-body">This is a guest article by Stanislav Kozlovski, an Apache Kafka Committer. If you would like to connect with Stanislav, you can do so on Twitter and LinkedIn.
Originally developed in LinkedIn during 2011, Apache Kafka is one of the most popular open-source Apache projects out there. So far</p>
<footer class="gh-card-meta">
<!--
-->
<span class="gh-card-author">By ByteByteGo</span>
<time class="gh-card-date" datetime="2024-05-09">09 May 2024</time>
<!--
--></footer>
</div>
</a>
</article>
<article class="gh-card post">
<a class="gh-card-link" href="/capturing-a-billion-emo-j-i-ons/">
<figure class="gh-card-image">
<img
srcset="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w160/format/webp/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif 160w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w320/format/webp/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif 320w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/format/webp/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif 600w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w960/format/webp/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif 960w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w1200/format/webp/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif 1200w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w2000/format/webp/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif 2000w"
sizes="320px"
src="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/2024/03/1-rSRWALA4XzOdDcn-5vv7Zw.gif"
alt="Capturing A Billion Emo(j)i-ons"
loading="lazy"
>
</figure>
<div class="gh-card-wrapper">
<h3 class="gh-card-title is-title">Capturing A Billion Emo(j)i-ons</h3>
<p class="gh-card-excerpt is-body">This blog post was written by Dedeepya Bonthu. This is a repost from her Medium article, approved by the author.
In stadiums, sports fans love to express themselves by cheering for their favorite teams, holding up placards and team logos. Emoji’s allow fans at home to rapidly express themselves,</p>
<footer class="gh-card-meta">
<!--
-->
<span class="gh-card-author">By ByteByteGo</span>
<time class="gh-card-date" datetime="2024-03-26">26 Mar 2024</time>
<!--
--></footer>
</div>
</a>
</article>
<article class="gh-card post">
<a class="gh-card-link" href="/brief-history-of-scaling-uber/">
<figure class="gh-card-image">
<img
srcset="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w160/format/webp/2026/03/1704993859593.png 160w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w320/format/webp/2026/03/1704993859593.png 320w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/format/webp/2026/03/1704993859593.png 600w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w960/format/webp/2026/03/1704993859593.png 960w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w1200/format/webp/2026/03/1704993859593.png 1200w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w2000/format/webp/2026/03/1704993859593.png 2000w"
sizes="320px"
src="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/2026/03/1704993859593.png"
alt="Brief History of Scaling Uber"
loading="lazy"
>
</figure>
<div class="gh-card-wrapper">
<h3 class="gh-card-title is-title">Brief History of Scaling Uber</h3>
<p class="gh-card-excerpt is-body">This blog post was written by Josh Clemm, Senior Director of Engineering at Uber Eats. This is a repost from his LinkedIn article, approved by the author.
On a cold evening in Paris in 2008, Travis Kalanick and Garrett Camp couldn&#39;t get a cab. That&#39;s when</p>
<footer class="gh-card-meta">
<!--
-->
<span class="gh-card-author">By ByteByteGo</span>
<time class="gh-card-date" datetime="2024-03-14">14 Mar 2024</time>
<!--
--></footer>
</div>
</a>
</article>
<article class="gh-card post">
<a class="gh-card-link" href="/behind-aws-s3s-massive-scale/">
<figure class="gh-card-image">
<img
srcset="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w160/format/webp/2024/03/7.png 160w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w320/format/webp/2024/03/7.png 320w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/format/webp/2024/03/7.png 600w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w960/format/webp/2024/03/7.png 960w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w1200/format/webp/2024/03/7.png 1200w,
https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w2000/format/webp/2024/03/7.png 2000w"
sizes="320px"
src="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/size/w600/2024/03/7.png"
alt="Behind AWS S3’s Massive Scale"
loading="lazy"
>
</figure>
<div class="gh-card-wrapper">
<h3 class="gh-card-title is-title">Behind AWS S3’s Massive Scale</h3>
<p class="gh-card-excerpt is-body">This is a guest article by Stanislav Kozlovski, an Apache Kafka Committer. If you would like to connect with Stanislav, you can do so on Twitter and LinkedIn.
AWS S3 is a service every engineer is familiar with.
It’s the service that popularized the notion of cold-storage to</p>
<footer class="gh-card-meta">
<!--
-->
<span class="gh-card-author">By ByteByteGo</span>
<time class="gh-card-date" datetime="2024-03-06">06 Mar 2024</time>
<!--
--></footer>
</div>
</a>
</article>
</div>
</div>
</section>
<footer class="gh-footer gh-outer">
<div class="gh-footer-inner gh-inner">
<section class="gh-footer-signup">
<h2 class="gh-footer-signup-header is-title">
High Scalability
</h2>
<p class="gh-footer-signup-subhead is-body">
Building bigger, faster, more reliable websites.
</p>
<form class="gh-form" data-members-form>
<input class="gh-form-input" id="footer-email" name="email" type="email" placeholder="jamie@example.com" required data-members-email>
<button class="gh-button" type="submit" aria-label="Subscribe">
<span><span>Subscribe</span> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" viewBox="0 0 256 256"><path d="M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"></path></svg></span>
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
<g stroke-linecap="round" stroke-width="2" fill="currentColor" stroke="none" stroke-linejoin="round" class="nc-icon-wrapper">
<g class="nc-loop-dots-4-24-icon-o">
<circle cx="4" cy="12" r="3"></circle>
<circle cx="12" cy="12" r="3"></circle>
<circle cx="20" cy="12" r="3"></circle>
</g>
<style data-cap="butt">
.nc-loop-dots-4-24-icon-o{--animation-duration:0.8s}
.nc-loop-dots-4-24-icon-o *{opacity:.4;transform:scale(.75);animation:nc-loop-dots-4-anim var(--animation-duration) infinite}
.nc-loop-dots-4-24-icon-o :nth-child(1){transform-origin:4px 12px;animation-delay:-.3s;animation-delay:calc(var(--animation-duration)/-2.666)}
.nc-loop-dots-4-24-icon-o :nth-child(2){transform-origin:12px 12px;animation-delay:-.15s;animation-delay:calc(var(--animation-duration)/-5.333)}
.nc-loop-dots-4-24-icon-o :nth-child(3){transform-origin:20px 12px}
@keyframes nc-loop-dots-4-anim{0%,100%{opacity:.4;transform:scale(.75)}50%{opacity:1;transform:scale(1)}}
</style>
</g>
</svg> <span>Email sent</span>
</button>
<p data-members-error></p>
</form>
</section>
<div class="gh-social-links">
<a href="https://x.com/ghost" target="_blank" rel="noopener" aria-label="X">
<svg viewBox="0 0 24 24" fill="currentColor"><g><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg> </a>
<a href="https://www.facebook.com/ghost" target="_blank" rel="noopener" aria-label="Facebook">
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M23.9981 11.9991C23.9981 5.37216 18.626 0 11.9991 0C5.37216 0 0 5.37216 0 11.9991C0 17.9882 4.38789 22.9522 10.1242 23.8524V15.4676H7.07758V11.9991H10.1242V9.35553C10.1242 6.34826 11.9156 4.68714 14.6564 4.68714C15.9692 4.68714 17.3424 4.92149 17.3424 4.92149V7.87439H15.8294C14.3388 7.87439 13.8739 8.79933 13.8739 9.74824V11.9991H17.2018L16.6698 15.4676H13.8739V23.8524C19.6103 22.9522 23.9981 17.9882 23.9981 11.9991Z"/></svg> </a>
</div>
<div class="gh-footer-bar">
<span class="gh-footer-logo is-title">
High Scalability
</span>
<nav class="gh-footer-menu">
<ul class="nav">
<li class="nav-sign-up"><a href="#/portal/">Sign up</a></li>
</ul>
</nav>
<div class="gh-footer-copyright">
Powered by <a href="https://ghost.org/" target="_blank" rel="noopener">Ghost</a>
</div>
</div>
</div>
</footer>
</div>
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<div class="pswp__bg"></div>
<div class="pswp__scroll-wrap">
<div class="pswp__container">
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--share" title="Share"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"></button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"></button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
<script src="https://highscalability.com/assets/built/source.js?v=uMULaSMoSjM4gY5C"></script>
</body>
</html>