Cell-based architecture earns its cost when a platform has a concrete blast-radius objective that shared horizontal scaling cannot meet. A cell is a repeatable unit of data and compute serving a bounded tenant or request population. It should fail, deploy, and recover largely independently. Start with one noisy or high-value cohort and a routing boundary; do not rebuild the whole platform at once.
Begin with the failure you need to contain
Write the constraint numerically: “A failed deploy or overloaded database may affect at most 5% of tenants,” or “Queue recovery must complete within two hours without processing the entire global backlog.” Cells are not justified by service count. They are justified when shared components create an unacceptable correlated failure or recovery workload.
The AWS Well-Architected bulkhead guidance recommends partitioning workloads to contain failures and describes tradeoffs such as additional complexity and capacity. A cell is a broad bulkhead: its compute, storage, queues, and local dependencies should align to the same partition where feasible. A nominal cell that shares one write database and one queue still has global failure domains.
Measure recent incidents. Which shared resource spread impact? How many tenants were affected? Did recovery time grow with global backlog or dataset size? If rate limits, workload isolation, or a separate queue for one class solves the actual problem, use that smaller control first.
Choose a durable partition key
Tenant ID is common because most requests and data stay within one tenant. Geography may fit residency and latency. A random user shard may balance load but makes organization-level operations cross-cell. Evaluate locality, skew, movement frequency, data regulation, and whether one business transaction crosses partitions.
Maintain a directory mapping key to cell. Routing must be available and consistent enough to prevent dual writes. Include a mapping version in requests and make moves an explicit state machine: copy, catch up, quiesce or dual-read under controlled rules, switch routing atomically, verify, then retire the old copy. Avoid casual cell reassignment for load balancing; data movement is an operational event.
Large tenants may dominate one cell. Give them dedicated cells or a documented subpartition instead of allowing automatic hashing to undermine the blast-radius target. Keep capacity headroom so loss of one cell does not require every healthy cell to accept its entire load immediately.
Keep the control plane small and survivable
Some services remain global: cell directory, identity entry point, deployment coordination, and fleet observability. Separate their read path from mutation where possible. Cache signed or versioned routing data so existing tenants can continue during a brief control-plane outage. A global control plane that every request must synchronously query can erase cell independence.
Deploy one cell at a time with health gates and stop conditions. Preserve version compatibility across the fleet while rollout is mixed. Aggregate metrics globally, but retain cell labels so one bad unit is visible. Run failover and evacuation drills that measure affected tenants, directory convergence, backlog drain, and operator steps.
Stage adoption around one seam
First establish tenant-aware routing in front of an unchanged stack. Next create two instances of the highest-risk stateful boundary, such as worker queue and database, and place a small cohort in the new cell. Then automate cell provisioning, schema rollout, capacity checks, backups, and retirement. A hand-built second environment is not yet an architecture.
Use this decision test: named blast-radius objective; strong partition locality; a routing key that rarely moves; cell-local data and queues; survivable control plane; automated provisioning; per-cell deploy and recovery; and acceptable spare capacity.
Pick the incident with the largest correlated impact. Draw every shared dependency that spread it and mark the smallest boundary that would have contained it. Prototype that boundary for one internal tenant, then deliberately overload it and verify that other tenants remain within their SLO.
Google’s SRE guidance on handling overload shows how retries can create feedback under saturation. Include retry admission and time-to-drain in every cell overload drill.
Sources are linked throughout this guide. Product capabilities can change; consult the linked documentation for your deployment.
Read our editorial approach ↗