Files
nexus/sreweekly/articles/215/08-one-team-at-uber-is-moving-from-microservices-to-macroservices.html
2026-09-12 17:23:01 +08:00

538 lines
44 KiB
HTML
Raw Permalink 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>One Team at Uber is Moving from Microservices to Macroservices - 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/one-team-at-uber-is-moving-from-microservices-to-macroservic/">
<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="One Team at Uber is Moving from Microservices to Macroservices - High Scalability -">
<meta property="og:description" content="There may be an undiscovered tribe deep in some jungle somewhere that hasn&amp;rsquo;t made ...">
<meta property="og:url" content="https://highscalability.com/one-team-at-uber-is-moving-from-microservices-to-macroservic/">
<meta property="og:image" content="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/2024/02/49749443048_1922a00301-1.jpg">
<meta property="article:published_time" content="2020-04-08T16:10:28.000Z">
<meta property="article:modified_time" content="2024-02-02T12:33:11.000Z">
<meta property="article:tag" content="architecture">
<meta property="article:tag" content="SOA">
<meta property="article:tag" content="microservices">
<meta property="article:publisher" content="https://www.facebook.com/ghost">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="One Team at Uber is Moving from Microservices to Macroservices - High Scalability -">
<meta name="twitter:description" content="There may be an undiscovered tribe deep in some jungle somewhere that hasn’t made up their mind on microservices, but I doubt it. People love microservices or love to hate microservices. There’s not much in between.
So it means something when even a team at a company like">
<meta name="twitter:url" content="https://highscalability.com/one-team-at-uber-is-moving-from-microservices-to-macroservic/">
<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="architecture, SOA, microservices">
<meta name="twitter:site" content="@ghost">
<meta name="twitter:creator" content="@highscal">
<meta property="og:image:width" content="500">
<meta property="og:image:height" content="333">
<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": "One Team at Uber is Moving from Microservices to Macroservices - High Scalability -",
"url": "https://highscalability.com/one-team-at-uber-is-moving-from-microservices-to-macroservic/",
"datePublished": "2020-04-08T16:10:28.000Z",
"dateModified": "2024-02-02T12:33:11.000Z",
"keywords": "architecture, SOA, microservices",
"description": "There may be an undiscovered tribe deep in some jungle somewhere that hasn’t made up their mind on microservices, but I doubt it. People love microservices or love to hate microservices. There’s not much in between.\n\nSo it means something when even a team at a company like Uber announces a change away from microservices to something else. What? Macroservices. But we’ll get to that. Think what you want about Uber the company, but from a software perspective Uber has been a good citizen.\n\nGergely ",
"mainEntityOfPage": "https://highscalability.com/one-team-at-uber-is-moving-from-microservices-to-macroservic/"
}
</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="f26f6799-157b-4f45-81b0-b660394a7efb" 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-architecture tag-soa tag-microservices 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-architecture tag-soa tag-microservices tag-hash-sqs no-image">
<header class="gh-article-header gh-canvas">
<a class="gh-article-tag" href="https://highscalability.com/tag/architecture/">architecture</a>
<h1 class="gh-article-title is-title">One Team at Uber is Moving from Microservices to Macroservices</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="2020-04-08">08 Apr 2020</time>
<span class="gh-article-meta-length"><span class="bull">—</span> 7 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="https://storage.ghost.io/c/64/72/647204cd-7ad2-4539-b98a-3489074b932d/content/images/2024/02/49749443048_1922a00301.jpg" class="kg-image" alt loading="lazy"></figure><p>There may be an undiscovered tribe deep in some jungle somewhere that hasn’t made up their mind on microservices, but I doubt it. People love microservices or love to hate microservices. There’s not much in between.</p><p>So it means something when even a team at a company like Uber announces a change away from microservices to something else. What? Macroservices. But we’ll get to that. Think what you want about Uber the company, but from a software perspective Uber has been a good citizen.</p><p>Gergely Orosz, an Engineering Manager on the Payments Experience Platform at Uber, in a tweet signaled a change in architectural direction:</p><blockquote><a href="https://twitter.com/GergelyOrosz/status/1247132806041546754?ref=highscalability.com">@GergelyOrosz</a>: For the record, at Uber, we're moving many of our microservices to what  @copyconstruct calls macroservices (well-sized services).</blockquote><blockquote>Exactly b/c testing and maintaining thousands of microservices is not only hard - it can cause more trouble long-term than it solves the short-term.</blockquote><blockquote>- Microservices _do_ help teams move fast early on.</blockquote><blockquote>- By the time you realize fewer services would be great, it's too late. You need to solve the "hard" part of many services.</blockquote><blockquote>- We keep adding more services, but also retiring, and putting more thoughtfulness in new ones.</blockquote><blockquote><a href="https://twitter.com/GergelyOrosz/status/1247863888890265601?ref=highscalability.com">@GergelyOrosz</a>:</blockquote><blockquote>Yes, we're doing this and the approach touches on a pain point of many microservices.</blockquote><blockquote>Every service needs to support tenancies, including many stateless ones.</blockquote><blockquote>We also need to retrofit much of this work with the existing services. For new services, we just add it from the start.</blockquote><blockquote><a href="https://twitter.com/GergelyOrosz/status/1247545085530714114?ref=highscalability.com">@GergelyOrosz</a>:</blockquote><blockquote>1. Microservices helped (and still help) move fast, be autonomous &amp; experiment.</blockquote><blockquote>2. The more mature an area becomes, the more sense / easier to reason "well-sized services" are.</blockquote><blockquote>I'll have to write up thoughts in longer form later.</blockquote><blockquote><a href="https://twitter.com/GergelyOrosz/status/1247260209116053507?ref=highscalability.com">@GergelyOrosz</a>:</blockquote><blockquote>I'm probably overdue with a post on the hard-learned downsides of microservices. There's lots of talk of the blissful honeymoon period, but people rarely talk how they later get into nasty fights with microservices, then make up but change a few things. For good.</blockquote><blockquote><a href="https://lobste.rs/s/mc3k1c/at_uber_we_re_moving_many_our?ref=highscalability.com#c_f8vacm">Gregdoesit</a>:</blockquote><blockquote>I wrote that tweet that is making the rounds. Not many things fit in 280 characters and Twitter being immutable, there’s not many things you can go back to clarify. So let me give some more details on this forum.</blockquote><p>I speak for my experience, for my team, not for all of Uber. Heck, we have hundreds of teams, 95% of whom I don’t know. And teams are autonomous and decide how and what they do (including following guidelines or ignoring them partially or fully) - even if I wanted to, I couldn’t make sweeping statements.</p><p>Uber has - and still has - thousands of microservices. Last I checked it was [around 4,000]. (https://eng.uber.com/optimizing-observability/). And, to be very clear: this number is (and will keep) growing.</p><p>I’ve been working here for almost 4 years and see some trends in my org / area (payments). Back in the day, we’d spin up a microservice that did one, small thing just like that. We had a bunch of small services built and maintained by one person. This was great for autonomy, iteration speed, learning and making devops a no-brainer. You could spin up a service anytime: but you’d be oncall for it.</p><p>Now, as my area is maturing and it’s easier to look ahead, as we create new platforms, we’re doing far more thoughtful planning on new services. These services don’t just do one thing: they serve one business function. They are built and maintained by a team (5-10 engineers). They are more resilient and get far more investment development and maintenance-wise than some of those early microservceis. Cindy called these macroservices and I said we’re doing something similar. The only difference in what we do is a service is owned by one team, not multiple teams.</p><p>While many microservices are evolving like this, the majority, frankly, stays as is. Thousands of microservices bring a lot of problems that need to be solved. Monitoring. Testing. CI/CD, SLAs. Library versions across all of them (security, timezone issues). And so on. There are good initiatives we keep doing - and sharing what works and open sourcing some of the tools we build to deal with the problems, as they pop up. Like testing microservices with a multi-tenancy approach. Distributed tracing across the services. All of this is a lot of investment. Only do microservices at scale if you’re ready to make this investment.</p><blockquote>So no, Uber is not going no-microservices like I’m seeing many people interpret it. It’s not even going to less microservices. And when I said “we’re moving”, that was not exact phrasing. New microservices are more thoughtfully created in my team and in my org. These are “larger” services than some of the early, small, focused, microservices.</blockquote><blockquote>Microservices worked well at Uber in many ways and keep helping in others areas. There are problems, of course, and you deal with the problems as you go. This would be the same with e.g. a monolith with thousands of developers, SOA with thousands of developers or {you name whatever you do} with thousands of developers. The number of services is still growing, as a whole, as the business grows - though in some orgs, like mine, they are at level, or even going down a bit (though this is not the goal itself). But not all microservices are equal any more. The critical ones look less like your classic microservice - or at least what I called microservices years back.</blockquote><blockquote>On another note: everyone interprets the name “microservice” differently. I’ll write a post summarizing my experiences with the ups and downs of microservices at scale. For now, hopefully this gives some more color.</blockquote><blockquote><a href="https://lobste.rs/s/mc3k1c/at_uber_we_re_moving_many_our?ref=highscalability.com#c_eia8v5">Gregdoesit</a>:</blockquote><blockquote>Uber went from monolith to SOA in 2015. This SOA followed a microservice-based architecture. And we’ve been sharing what we learned along the way: the steps it usually takes to build a microservice, addressing testing problems with a multi-tenancy approach or how and why we use distributed tracing. We also open sourced some of our tools like Jaeger, which is part of the Cloud Native Foundation’s graduated projects, alongside Kubernetes and Prometheus...All of these can serve as inspiration: but the end of the day, you need to make decisions in your environment that you think will work best. Anyone copying the likes of Google, Uber, Shopify, Stack Overflow or others when they’re not even similar in setup will be disappointed.</blockquote><blockquote><a href="https://twitter.com/copyconstruct/status/1247130488667394049?ref=highscalability.com">@copyconstruct</a>:</blockquote><blockquote>- Microservices are hard.</blockquote><blockquote>- Building reliable and testable microservices is a lot harder than most folks think</blockquote><blockquote>- Effectively *testing* microservices requires a ton of tooling and foresight.</blockquote><blockquote>- A Netflix/Uber style microservices isn't required by many (most?) orgs.</blockquote><blockquote>- Macroservices?</blockquote><blockquote>Macroservice:</blockquote><blockquote>- not a monolith</blockquote><blockquote>- Has no more than 20 devs/3 teams working on the service (5 pizza rule?)</blockquote><blockquote>- may or may not have/need monorepo. Dependency management becomes a lot easier (though still non-trivial) the fewer the services/repos</blockquote><blockquote>- better observability, debugging</blockquote><p>The world will of course go crazy that we have a new semi-branded term like macroservice.</p><p>How is a macroservice different from the plain old service we've known for decades? Who cares. Names are a product of their times. Names simply serve as a scaffolding for discussions. This isn’t magic. A name isn’t a secret symbol that must be kept safe lest a dark arts practitioner turn you into their meat puppet. A name is just a gathering place, a marker, that helps us find our way. Take a deep breath, let any name induced angst go.</p><p>As you might imagine there has been a lot of response. Much of it gleefully extolling the much deserved end to the microservices scourge. Microservices have always been a bad idea is the general consensus of the dissenterati.</p><blockquote><a href="https://twitter.com/sandofsky/status/1247629388104880129?ref=highscalability.com">@sandofsky</a>:</blockquote><blockquote>Uber in 2016: “We have thousands of microservices.”</blockquote><blockquote>Everyone: “That sounds insane."</blockquote><blockquote>Uber in 2020: “It turns out that was insane.”</blockquote><blockquote><a href="https://twitter.com/dhh/status/1247520755547377664?ref=highscalability.com">@dhh</a>:</blockquote><blockquote>The amount of pain that’s been inflicted by the overeager adoption of microservices is immense.</blockquote><blockquote>In addition to the Majestic Monolith, someone should write up the pattern of The Citadel: A single Majestic Monolith captures the majority mass of the app, with a few auxiliary outpost apps for highly specialized and divergent needs.</blockquote><p>But it’s not all negative.</p><blockquote><a href="https://twitter.com/saikishore001/status/1247762347055181824?ref=highscalability.com">@saikishore001</a>:</blockquote><blockquote>We have found quite a bit of success at Bayer with microservices. For us maintaining a large monolith was a nightmare.. now, much much better with microservices architecture.</blockquote><blockquote><a href="https://twitter.com/Carnage4Life/status/1247861575391694848?ref=highscalability.com">@Carnage4Life</a>:</blockquote><blockquote>There are 2 key lessons from Uber moving away from microservices after being a big proponent of them in 2016</blockquote><blockquote>1. The trade offs that big companies at large scale make may not be right for your startup</blockquote><blockquote>2. Big companies also make poor architectural choices so beware cargo culting</blockquote><blockquote><a href="https://twitter.com/adam_zethraeus/status/1247834212226326529?ref=highscalability.com">@adam_zethraeus</a>:</blockquote><blockquote>Uber only really did that in order to avoid coordination cost. Building without concern for reuse or consolidation was, roughly speaking, explicitly encouraged. e.g. Uber's China team reproduced a bunch of tertiary architecture to move faster. (Worked in the short term!)</blockquote><p>There's an economic argument for the architectural hype cycle that's also worth considering:</p><blockquote><a href="https://twitter.com/ridingwithrails/status/1247911872847687681?ref=highscalability.com">@ridingwithrails</a></blockquote><blockquote>During Internet crashes and recessions monoliths always win.  Folks realize it is hard to keep ten teams that use ten different systems around ... bye Felicia!:</blockquote><blockquote><a href="https://twitter.com/sandofsky/status/1129083949752262656?ref=highscalability.com">@sandofsky</a></blockquote><blockquote>Every tech talk should have to disclose their venture capital burn rate. You can get away with just about anything when throwing someone else’s money at your problems.</blockquote><p>The glee in the potential downfall of microservices is not a great look for the industry. We need to focus on getting things right rather than being right. I know, being right is at the very heart of competitive nerdom.</p><p>Change is how we progress and adding friction to the change process doesn’t help anyone. Uber maturing, learning, refactoring is a good thing. It's not an admission of failure or even evidence of poorly made decisions early on. When you have a lot of money and the BHAG of taking over the world, microservices make a lot of sense. As does retrenching and consolidating when that phase of your growth comes to an end. What do you do when facts on the ground change?</p><p>Face it, we have next to no idea of how to build software. I'm convinced part of the reason microservices took off as they did is because it at least gave programmers a coherent theory of how to build programs.</p><p>Everyone gives their own pet alternative to microservices, but there is no consensus, we have no systematic theory. Witness this whole discussion as evidence.</p><p>Software is a mess.</p><h2 id="related-articles">Related Articles</h2><ul><li><a href="https://eng.uber.com/multitenancy-microservice-architecture/?ref=highscalability.com">Why We Leverage Multi-tenancy in Uber’s Microservice Architecture</a></li><li><a href="https://blog.pragmaticengineer.com/distributed-architecture-concepts-i-have-learned-while-building-payments-systems/?ref=highscalability.com">Distributed architecture concepts I learned while building a large payments system</a></li><li><a href="https://blog.pragmaticengineer.com/operating-a-high-scale-distributed-system/?ref=highscalability.com">Operating a Large, Distributed System in a Reliable Way: Practices I Learned</a></li><li><a href="https://www.slideshare.net/slideshow/embed_code/key/88gESdLe2ElnAH?ref=highscalability.com">Continuous Testing at Scale</a></li><li><a href="https://eng.uber.com/service-oriented-architecture/?ref=highscalability.com">Service-Oriented Architecture: Scaling the Uber Engineering Codebase As We Grow</a></li></ul>
</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="65bceaca3953980001659af6" 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>