← Writing
4 min read

Cells, Not Monoliths: Containing Blast Radius at Hyperscale

Cloud ArchitectureDistributed SystemsReliability

When people outside the industry ask what it's like to work on infrastructure "at cloud scale," they usually imagine a war room full of engineers heroically fighting a fire. That picture is almost entirely wrong. The best architecture I've worked on made those moments rare on purpose. The goal was never to prevent failure — it was to make failure small.

Every service I've built or operated since has been shaped by that single idea: the blast radius is the real design surface.

Failure is a design input, not an exception

Most systems are built for the happy path and then patched to survive its absence. That ordering is backwards. If you assume from the first whiteboard that a host will die, a rack will lose power, a region's network path will degrade, and a dependency will start returning errors, the design gets simpler rather than more complex — because you stop pretending any of those things won't happen.

The useful question is not "will this fail?" It is:

If this fails, how much of the product fails with it, and how quickly can we isolate it?

If the honest answer is "everything" or "we're not sure," the architecture is telling you something.

The blast radius is the unit of design

The most powerful tool for shrinking blast radius is partitioning. Instead of one large pool of shared resources, you deliberately split workloads into independent cells — self-contained slices that share nothing at the failure boundary.

A cell-based design means a bad deployment, a hot partition, or a corrupted piece of state can only ever take down the slice it lives in. Everything else keeps serving traffic. Two ideas are worth internalizing here:

  1. Cells bound the damage. Each cell is an independent unit with its own resources and (importantly) its own failure modes. A cell that is fully broken should be invisible to every other cell.
  2. Randomized assignment buys resilience. Shuffle sharding routes each request or tenant to a random subset of cells. Two unlucky neighbors occasionally share a cell, but most don't — so a single degraded cell affects a statistically tiny, unpredictable fraction of traffic instead of everyone routed to it.

The counterintuitive part is that cells increase operational complexity while decreasing systemic risk. You're trading a simpler topology for a much smaller worst case. At scale, that trade is almost always correct.

Keep the control plane out of the request path

A pattern that shows up everywhere in large systems is the separation of the control plane (configuring the system) from the data plane (serving live traffic). They have completely different availability requirements, and confusing them is one of the most common causes of large outages.

        Intent (desired state)
              │
      ┌───────▼────────┐
      │  Control Plane │   ← changes slowly, can be unavailable briefly
      └───────┬────────┘
              │ programs state
      ┌───────▼────────┐
      │   Data Plane   │   ← must keep serving, even if control is down
      └────────────────┘

The data plane should be able to keep forwarding traffic on its last-known-good configuration even if the control plane is completely unavailable. That property — often called static stability — is what stops a config-management outage from becoming a customer-facing outage.

I've watched teams learn this the hard way: they made the data plane call back into the control plane for permission on a hot path, and then a control-plane deploy turned into a full traffic outage. The fix wasn't faster deploys. The fix was removing the dependency.

Deployments are the sharpest knife you own

Nothing changes a large system faster than a bad deploy, which makes the deployment pipeline the highest-leverage piece of reliability engineering you have. The principles that matter most:

This is exactly where the deployment-time improvements matter: every minute you shave off the safe path from commit to production is a minute the team gets back, and every guardrail you add means the fast path is also the safe path.

What I carry into every new system

The lessons generalize far beyond the hyperscaler. When I design a system today, I ask:

Failure isn't the enemy of scale. Unbounded failure is. Cells, static stability, and disciplined rollouts are how you keep the first from becoming the second.

← Back to all writing