← Back to blog


The Great Microservices Myth

1/14/2025

Let’s begin with an admission: I once believed in microservices the way children believe in the Tooth Fairy—earnestly, uncritically, and with a giddy anticipation of reward1. I thought if I could just break down a monolithic application into enough tidy, discrete pieces, every single problem under the digital sun would evaporate. Code sprawl? Gone. Deployment pains? Handled. Team autonomy? Instant and effortless. It’s precisely the kind of shimmering daydream the software industry loves to sell, with a certain breathless fervor, in countless conference talks and blog posts.

Fast forward a few years, and I have survived a microservices meltdown or two2. Not because microservices as a concept are inherently evil, but because we collectively have a knack for forgetting that complexity doesn’t disappear when we subdivide an application—it just migrates. It slithers off into new places, intangible places, the same way your cat might vanish into the darkest corner of your couch, reappearing at the exact moment you least expect. Which is to say, microservices are no magic bullet. They’re just another pattern we adopt in the hope of taming the cosmic sprawl of software.

Why Microservices Shine—Or Seem to

The initial pitch is seductively logical: “Let’s break the monolith into smaller, more maintainable services.” Each piece does one thing well, like a chorus of well-drilled performers hitting their notes in perfect unison. You can scale certain components independently. If service A is hammered by 10,000 requests per second, you just spin up more of A, ignoring B, C, and D. The entire codebase becomes so trivially separated that each micro-team can focus on their micro-domain, presumably without stepping on each other’s toes.

For a while, you do get the sweet illusion of isolation. Deploying a single service feels easier, at least until you notice your local machine is now running half a dozen Docker containers just to get a dev environment going3. Then you realize each microservice has its own data store, because that’s the “right” thing to do to avoid collisions, and now you have multiple databases to manage, each with its own migration scripts and performance quirks. The fractal complexity starts to bloom in ways no one mentioned in the marketing brochure.

The Hydra Problem

In Greek mythology, the Hydra was a serpent-like monster that sprouted two heads whenever one was cut off. This is my personal analogy for microservices—each time you elegantly solve a problem by shoving it into a new service, two new complexities emerge in the form of:

  1. Inter-service communication—HTTP calls, message queues, event streams, or carrier pigeons (depending on your preference).
  2. Operational overhead—metrics, logging, tracing, authentication, retries, circuit breakers, load balancing, your mental health.

So it’s not that microservices are a bad idea; it’s that in practice they often require an entire ecosystem of orchestration that you must design, build, and maintain. Meanwhile, in the monolith, you might have had a single codebase to track and a single deployment pipeline. But you’re told, “Oh, that’s old-fashioned. We want the freedom to scale each feature independently!” Sure, but now every microservice is like a small child demanding your constant attention. If you have five or six children, you might manage it. Twenty or thirty, you start forgetting their names.

When It Works

In fairness, there are companies—typically large, multinational, starring in their own documentary about unstoppable growth—where microservices shine. If you have multiple teams, each with deeply specialized areas, and each domain is truly distinct, microservices can be a clarifying force. Netflix is the perennial example: streaming is a complicated domain, and you need teams focusing on recommendation engines, user profiles, billing, content delivery, etc. For them, many smaller services might indeed reduce the complexity each team faces.

But remember: Netflix also invests enormous resources in building out robust DevOps, container orchestration, canary deployments, chaos engineering, and so forth. They have staff, presumably an entire phalanx of extremely caffeinated engineers, devoted to ensuring that microservices function reliably across an expansive global infrastructure. If your startup of 12 people tries to replicate that, you might find the overhead crippling without the commensurate scale.

The Cultural Factor

What no one told me in my starry-eyed microservices youth was how much this approach depends on culture. If you’re going to isolate components, you need teams that are comfortable with asynchronous communication, operational autonomy, and a willingness to sometimes let colleagues stub their toes on unexpected issues. Put another way, a monolith can hide cultural friction behind a single codebase. Microservices drag that friction into the open. If your teams won’t or can’t handle that friction, you might end up with repeated fiascos over “whose service is down?” or “why is team X hogging the message queue?”

In some ways, microservices are like being in a band: the idea is that each musician can shine on their instrument, but if they don’t actually rehearse together or follow the same beat, the result is dreadful noise. The panacea of “independent deployability” still requires a shared sense of what done means, and how each part is supposed to talk to the others. If you lack that, your microservices journey can become a Kafkaesque scramble of partial, uncoordinated updates.

So, Should We All Just Monolith?

Not necessarily. This is not a rousing call for monolithic everything. Sometimes, a well-designed monolith is absolutely easier to grasp, to develop on, to test, and to deploy. Other times, you’re building a system so large and so multi-faceted that any single codebase, no matter how well designed, becomes untenable. My point is merely that microservices are not the universal solution. They’re a pattern with strengths and weaknesses, heavily reliant on organizational readiness. And if you skip over the hidden complexities, you might be in for a rude awakening when service #27 starts failing for reasons you can’t quickly diagnose because the logs are scattered across multiple data centers.

Conclusion: Tread Lightly

If you’re reading this in a cozy workspace somewhere, quietly preparing your next big system design, here’s my humble suggestion: weigh the cost of complexity. Microservices can sometimes be the shiny object that leads you deeper into the labyrinth, not out of it. The question is whether your domain really needs 20 loosely coupled services, or if you’d be better off with a simpler structure. Because while microservices might solve certain scaling issues, they tend to spawn a Hydra of new operational challenges4.

In other words, don’t let the hype seduce you into believing you’ll never again experience downtime or deployment drama. As with anything in software, every choice is a trade-off. Make sure you’re trading the right things. And if you do end up going full microservices, be prepared for a new level of organizational discipline, one that extends beyond your code and into the very heart of how your teams communicate, plan, and manage their domains. If that still sounds thrilling—Godspeed. Just keep your Hydra-slaying sword at the ready.


Footnotes

  1. “Reward” in the form of ephemeral engineering kudos and imaginary productivity.
  2. One meltdown was caused by a circular dependency that felt like chasing my tail in a hall of mirrors. A personal highlight.
  3. Not to mention the thrilling day you must figure out why the gateway container can’t talk to the auth container, or the heartbreak of discovering your local DNS has turned against you.
  4. Also: be nice to your ops/DevOps folks. They’re in the trenches day and night, wrestling with these serpents so you can deploy your code with minimal friction.

© Alexander Cannon. Opinions evolve, especially after the tenth meltdown in a microservices environment.

← Read more articles

Comments

Noah G.
Very cool with the page!
2/15/2025

Add a Comment