Multi-Region Architecture
Multi-region architecture deploys a service across multiple geographic regions for lower latency to global users and survival of region-level outages. The two topologies are active-passive (one region serves traffic; the other stands by) and active-active (both serve live traffic). The hard parts aren't deploying to two regions — they're data replication, consistency models, and data residency compliance.
How it works
A multi-region system runs in two or more geographic cloud regions. The motivation is usually one or both of:
- Resilience: a region outage doesn't take down the service.
- Latency: users in each geography hit a local region, with network latency measured in ms instead of hundreds of ms.
Two topologies dominate:
- Active-passive: one region serves all traffic; the other is a standby that takes over on failure. Simpler. Lower cost. Higher RTO/RPO on failover.
- Active-active: both regions serve live traffic simultaneously. More complex. Higher cost. Lower RTO/RPO. Better latency for global users.
The trade-offs in multi-region are mostly about data, not compute. Replicating stateful services across regions is hard; replicating stateless services is easy.
Stateless services are easy to multi-region: deploy the same code to multiple regions, put a global load balancer (Cloudflare, Route 53, Cloud Load Balancing) in front, and route users to the nearest healthy region. No replication needed.
Stateful services are hard. A database in us-east-1 doesn't automatically exist in eu-west-1; you have to replicate it. The replication choices:
- Asynchronous: writes commit locally, replicate later. Fast writes, but failover can lose data (RPO = lag, often seconds). The replica can also serve stale reads.
- Synchronous: writes wait for the replica to acknowledge. Zero data loss, but every write pays cross-region latency (50-100ms+). Too slow for many workloads.
- Conflict resolution: in active-active, both regions can accept writes to the same key. You need last-writer-wins (clock-based, error-prone), CRDTs (data-type-specific, complex), or application-level merge logic.
This is why most active-active systems are sharded by region: each user's data lives in one region, replicated to others as a standby. No write conflicts because each user writes to one region. Read replicas serve other regions for low-latency reads.
How does traffic get to the right region? Three patterns:
- DNS-based routing (Route 53 latency routing, Cloudflare load balancing): the user's DNS lookup returns the IP of the nearest region. Simple, but DNS caching means failover takes the TTL (often 60s).
- Anycast IP: the same IP is announced from multiple regions; BGP routes the user to the nearest. Faster failover (no DNS), but harder to debug.
- Global proxy / CDN: Cloudflare, Fastly, or a global Layer 7 LB inspects the request and routes it. Most flexible — can route by user, by health, by content.
Failover works by removing the unhealthy region from the routing. The challenge is detecting regional failure: a region that's slow (not down) is harder to handle than one that's down. Most teams use a combination of health checks + manual approval for failover, to avoid false positives that route global traffic away from a healthy region.
GDPR, CCPA, and similar regulations require user data to stay in specific geographies. A EU user's data must stay in EU regions. This breaks naive active-active designs where a US read replica serves EU users — the replica is a copy of EU data in the US, which violates GDPR. The fix is region-pinned data: each user's primary data lives in their residency region; other regions only see what they're allowed to see. This often means cross-region requests for users who travel — a US user visiting the EU might still need to hit US infrastructure for their data.
Multi-region isn't free. The costs add up:
- Compute: 2x the instances (or more, for active-active).
- Replication bandwidth: cross-region data transfer is metered and expensive at scale. Streaming changelogs across regions can be a meaningful fraction of cloud bill.
- Storage: each region has its own copy.
- Operational complexity: deploying to multiple regions, monitoring both, debugging cross-region issues.
- Engineering complexity: handling partial failures (one region up, one down), conflict resolution, eventual consistency.
A common pattern: don't go multi-region until you've exhausted multi-AZ. Multi-AZ gives you single-region resilience cheaply. Multi-region is for when multi-AZ isn't enough — either because of latency to global users or because a single-region outage is unacceptable to the business.
Why is active-active multi-region harder than active-passive?
Pick one answer.
An EU user's data is replicated to a US region for low-latency reads by US support staff. Does this cause a problem?
Pick one answer.
Why would you choose asynchronous over synchronous cross-region replication?
Pick one answer.
Engineering mental model
Mental model. Think of Multi-Region Architecture as a deliberate boundary in a system. The boundary exists because something becomes harder to manage when everything is done in one place: latency, scale, failure isolation, consistency, cost, or team ownership. The useful question is not “what does Multi-Region Architecture mean?” but “what pressure makes this boundary worth introducing, and what new failure mode does it create?”
Before choosing Multi-Region Architecture, name the workload, the critical user path, the dominant bottleneck, the failure you are trying to absorb, and the trade-off you are willing to accept. If you cannot name those five things, the design is probably premature.
// Pseudocode
request = receive()
result = multi_region(request)
return result
// Production questions:
// 1. What happens on timeout?
// 2. Can this operation be retried safely?
// 3. What is the bottleneck?Back-of-the-envelope reasoning
Numerical lens: write down traffic, payload size, read/write ratio, peak multiplier and durability target before choosing a component. The numbers should justify the architecture.
Interactive thought experiment: Multi-Region Architecture
Change the variables below and predict what breaks first in Multi-Region Architecture. The production lab can later reuse these same inputs.
Change one variable at a time. Predict the failure mode first, then move the slider and see whether your mental model matches the simplified system response.
If you are stuck on Multi-Region Architecture, start by drawing the request path and marking every network hop, stateful component, queue, cache and failure boundary. Then estimate where the system will saturate.
You increase traffic by 10× in a system using Multi-Region Architecture. What should you inspect first?
Pick one answer.
Which statement is the safest engineering habit when using Multi-Region Architecture?
Pick one answer.
You have dashboards for traffic, latency, errors and saturation. You can change the architecture, but every change has operational cost.
Production scenario: your system uses Multi-Region Architecture, traffic suddenly spikes, and p99 latency doubles. What is your first move?
Interview drill
Answer this without notes: When would you choose Multi-Region Architecture, and when would you intentionally avoid it? Mention at least one bottleneck it addresses, one failure mode it introduces, and one alternative. Then quantify the workload you are designing for.
A useful engineering lens for Multi-Region Architecture: define the problem it solves, the simpler design that fails first, the constraint that forces you to introduce this concept, and the new failure modes the concept creates.
Numerical sanity check
Back-of-the-envelope reasoning beats fake precision. State your traffic, payload, concurrency and growth assumptions explicitly, then calculate enough to know whether the current architecture is orders of magnitude away from the target.
Do not optimize for a memorized definition. Reason from the workload and failure mode.
Imagine the simplest version of a system using Multi-Region Architecture. What breaks first as traffic grows by 10×, and what would you change before reaching 100×?
Pick one answer.
What you gain, what you pay
- +Survives region-level outages — true high availability.
- +Lower latency for global users (nearest-region routing).
- +Enables data residency compliance by pinning data per region.
- +Decouples availability from any single cloud region.
- −Cost: roughly 2x compute, storage, and cross-region transfer fees.
- −Operational complexity: deploy, monitor, and debug across regions.
- −Replication trade-offs: sync is slow, async risks data loss, active-active needs conflict resolution.
- −Data residency regulations complicate active-active designs.
How this breaks in production
- Cross-region replication lag exceeds RPO — actual data loss larger than the target on failover.
- DNS-based failover takes too long due to client DNS caching (TTL).
- False-positive failover: traffic routed away from a healthy region, causing user impact.
- Conflict resolution bugs in active-active (e.g., clock skew corrupts last-writer-wins).
Don't fall into these traps
- •Going multi-region before exhausting multi-AZ options.
- •Using active-active without a conflict resolution strategy for writes.
- •Ignoring data residency when designing replication topology.
- •Forgetting that DNS-based failover is bounded by client TTLs.
Real systems using this
How real systems implement this
- Netflix — Active-active across multiple AWS regions. Each region is independent and serves its geography's traffic. Region failure is survived by routing traffic to another region.
- Cloudflare — Anycast routing across ~300 cities. The user's request hits the nearest PoP automatically. Failover is implicit — BGP withdraws unhealthy PoPs.
Practice saying it out loud
- Q1Compare active-active and active-passive multi-region. When would you choose each?
- Q2How do you handle data residency in a multi-region system?
- Q3Why is synchronous cross-region replication often impractical, and what's the alternative?
- Q4How does traffic get routed to the right region, and how does it fail over?
Further reading & references
Core explanations are original NO CAP material. External references are provided for deeper study and standards.
What next?
Mark as understood once the mental model clicks.
Next recommended
Failover