Skip to main content

Blast Radius Reduction: Cells & Static Stability

Level 7: Level 7: Reliability, Resilience & Operationshard30 mincellsstatic-stabilityblast-radius

Cells give independent isolated stacks so one failure hits ~1/N of users, shuffle sharding gives each customer a unique worker combination to isolate noisy tenants, apply blast-radius thinking to deploys/data/dependencies, separate control plane from data plane, and use static stability so the data plane keeps serving last-known-good state when the control plane is down.

Blast-radius reduction limits how many users a failure hurts

Redundancy keeps you up when a component dies. Blast-radius reduction limits how many users any single failure, bad deploy, or poison input can hurt. The two are different: a perfectly redundant global fleet can still be taken down entirely by one bad config that every node loads. The goal here is that no single failure affects more than a small fraction of customers.

Cell-based architecture

Instead of one big shared stack serving all users, you run many independent, isolated cells, each a complete stack (LB, app, database, cache) serving a fixed subset of users. Cells share nothing at runtime: a failure, a bad deploy, an overloaded database, or a poison request in cell 7 cannot reach cells 1 through 6. If you have 20 cells and one fails, ~5% of users are affected, not 100%. A thin routing layer maps each user to their cell (by user id hash or tenant id) and is kept deliberately simple so it is not itself a fragile shared brain.

        [ thin cell router: user_id -> cell ]
        /        |          |          \
     cell-1    cell-2     cell-3  ...  cell-N     (each: full independent stack)
     LB/app    LB/app     LB/app       LB/app
     +DB       +DB        +DB          +DB
   failure in cell-3 stays in cell-3  ->  ~1/N of users affected

Cells also transform deploys: you roll a change cell by cell (a form of canary at the cell granularity), watch health, and stop after one cell if it regresses. A bad deploy hits one cell's worth of users, then halts.

Shuffle sharding

Shuffle sharding sharpens isolation for shared-worker pools where full cells are too coarse. Suppose 8 workers and you assign each customer 2 of them at random. With plain sharding (each customer pinned to 1 worker), a customer who sends poison traffic takes down everyone on that worker. With shuffle sharding, each customer gets a unique combination of 2 workers out of 8 (28 possible pairs). A noisy or malicious customer degrades only their 2 workers; another customer overlapping on at most one of those workers still has a second healthy worker and stays up. With enough workers and picks, the probability that two customers share their entire combination is tiny, so one poison tenant is isolated to a handful of others rather than everyone. AWS Route 53 and API Gateway use this to contain abusive customers.

Blast radius is a lens you apply everywhere, not just to compute: deploys (canary/cell-by-cell), data (partition so one corrupt shard is not the whole dataset), and dependencies (bulkheads and circuit breakers so one slow downstream does not exhaust every thread).

Control plane vs data plane, and static stability

Separate control plane from data plane. The data plane serves user requests (the hot path). The control plane manages the system: config changes, scaling decisions, deployments, service discovery, health orchestration. Control planes are complex and change often, so they fail more. If your data plane depends on the control plane being up to serve requests, then a control-plane outage becomes a user-facing outage. The rule: the data plane must keep serving even while the control plane is down.

Which brings in static stability, the AWS-coined principle that ties this together: a system is statically stable if it keeps working on its last-known-good state when its dependencies (especially the control plane) are unavailable, taking no new action that requires them. The canonical example: an EC2 instance keeps running even if the EC2 control-plane API is down, because running instances do not need the control plane; you just cannot launch new ones until it recovers. Applied to your design: cache config locally and keep serving the last-known-good config if the config service is unreachable, rather than failing or blocking. Load balancers should keep routing to the last-known-healthy set if the health-check control plane blips, rather than assuming "no data means all dead" and ejecting everyone. The failure mode static stability prevents is a control-plane hiccup cascading into a total data-plane outage.

Interview nuance: the wrong turn interviewers listen for is a design where "one bad tenant or one bad deploy takes down everyone," or where the data plane cannot serve a single request because a control-plane component (config store, service discovery, a central auth service) is briefly down. Strong answers bound impact with cells/shuffle-sharding and make the data plane statically stable so it coasts on cached state through control-plane failures.

Recap: cells give independent isolated stacks so one failure hits ~1/N of users, shuffle sharding gives each customer a unique worker combination to isolate noisy tenants, apply blast-radius thinking to deploys/data/dependencies, separate control plane from data plane, and use static stability so the data plane keeps serving last-known-good state when the control plane is down.

Apply

Your turn

The task this lesson builds to.

Redesign a multi-tenant SaaS so a bad deploy or poison tenant impacts under 5% of customers; use cells, shuffle sharding, and static stability.

Think about

  1. How do cells and shuffle sharding bound impact?
  2. Why separate control plane from data plane?
  3. What is static stability, and why does it matter when the control plane is down?

Practice

Make it stick

A second problem on the same idea, so it survives past today.

Explain how you would design a global DNS/health-check service (think Route 53 scale, serving millions of queries/second across all customers) so that one abusive customer's traffic and one control-plane outage each affect a minimal set of customers, and the service keeps answering queries even when its control plane is completely down.

Think about

  1. Why must the query data plane never call the control plane?
  2. How does shuffle sharding contain a customer under DDoS?
  3. Why is async propagation of record changes the safe design?