Filter concepts by levelShowing all levels.

System Design · PACELC

PACELC

Beyond partitions: every replicated system also trades latency against consistency in normal operation

  • CAP's extensionadds the "Else, no partition" branch
  • Latency vs consistencynearest replica vs quorum ack
  • Worked examplew:1 read vs w:"majority" write
  • Evaluation checklistPA/PC, then EL/EC, per operation

1.PACELC extends CAP to normal operation

CAP theorem only describes what a distributed system must give up during a network partition: availability or consistency. PACELC — coined by Daniel Abadi in 2010 and formalized in a 2012 paper — points out that CAP leaves the far more common case unaddressed: when there is no partition at all, a replicated system still has to choose between responding quickly (Latency) and making sure every replica agrees before responding (Consistency). The name spells out the full rule: if there is a Partition, choose Availability or Consistency; Else (normal operation), choose Latency or Consistency. A system's partition-time and normal-time choices don't have to match, and in practice a design is usually described by both letters at once, e.g. "PA/EL" or "PC/EC".

Key features

  • CAP's trade-off (Availability vs Consistency) only applies while a network Partition is actually happening.
  • PACELC adds the "Else" branch: even with zero partitions, a system still trades Latency against Consistency on every request.
  • The two branches are independent — a system's partition-time choice and its normal-time choice do not have to match.
  • Systems are commonly labeled with both branches at once: PA/EL (available + low-latency, weaker consistency) or PC/EC (consistent in both cases, at the cost of availability or latency).
  • Daniel Abadi proposed PACELC in a 2010 blog post and formalized it in a 2012 paper; the reasoning was later given a formal proof by Wojciech Golab in 2018.

CAP vs PACELC — what each one actually describes

CAP vs PACELC — what each one actually describes
TheoremConditionThe trade-off it names
CAPOnly while a partition is happeningAvailability vs Consistency
PACELC — "PA" or "PC" branchWhile a partition is happeningAvailability vs Consistency (same as CAP)
PACELC — "EL" or "EC" branchElse: normal operation, no partitionLatency vs Consistency
PACELC: two independent branches
checkyeselse

A replicated request

Partition?

CAP's question

A or C

availability vs consistency

L or C

latency vs consistency

  • A replicated request
    • leads to Partition? (check)
  • Partition? — CAP's question
    • leads to A or C (yes)
    • leads to L or C (else)
  • A or C — availability vs consistency
  • L or C — latency vs consistency

Command

text
PACELC:
  if Partition:
    choose Availability or Consistency   (this part is CAP)
  else (no partition, normal operation):
    choose Latency or Consistency        (this part is new)

Common labels combine both branches, e.g.:
  PA/EL — available under partition, low-latency normally
  PC/EC — consistent under partition, consistent normally

CAP only speaks during a partition (A vs C). PACELC adds the "Else": even with zero partitions, every replicated system trades Latency against Consistency on every single request — the two choices (partition-time and normal-time) are independent.

2.Worked example: nearest-replica read vs quorum-ack write

Take a replicated database running completely normally — no partition anywhere. Reading from the geographically nearest replica returns fast, but that replica might be a few hundred milliseconds behind the primary, so the read can be stale. Waiting for a quorum (a majority of replicas) to acknowledge a write before confirming it guarantees that a later read will see it, but every write now pays the round-trip latency to the slowest replica in that majority. Neither option involves any partition; both are pure, everyday latency-versus-consistency choices — exactly the "Else" branch PACELC names.

Key features

  • MongoDB's write concern w:1 only waits for the primary to apply a write, returning fast; w:"majority" waits for a calculated majority of data-bearing replica set members to durably acknowledge it, which is slower.
  • In a 3-member replica set, w:"majority" needs 2 of 3 members to ack; in a 5-member set, 3 of 5 — more members required raises latency further.
  • Reading from the nearest replica (rather than the primary) lowers read latency but risks returning data older than the replica's current replication lag.
  • DynamoDB's eventually consistent reads (its default) can be measurably faster and cost half as much as its strongly consistent reads, which always return the most recent successful write.
  • None of this requires a network partition — every one of these trade-offs is made continuously, during fully normal operation.

Two everyday choices, same underlying trade

Two everyday choices, same underlying trade
SystemFast/available choiceConsistent choiceCost of the consistent choice
MongoDB writesw: 1 (primary only)w: "majority"Waits for a majority of replica-set members to durably ack
DynamoDB readsEventually consistent (default)Strongly consistent (ConsistentRead: true)Cannot be served by a GSI/stream; costs 2x the read capacity
Generic replica readNearest replicaRead from primary / wait for replica to catch upExtra network hop or wait for replication lag to close
No partition — pure latency vs. consistency

Fast (w:1, nearest read)

  • Primary applies locally, replies ~5ms
  • Nearest secondary answers from its own copy
  • May not yet reflect the latest write

Consistent (w:majority, primary read)

  • Waits for a majority ack, ~40ms
  • Primary answers from the source of truth
  • Guaranteed to reflect any acknowledged write
  • Fast (w:1, nearest read)
    • Primary applies locally, replies ~5ms
    • Nearest secondary answers from its own copy
    • May not yet reflect the latest write
  • Consistent (w:majority, primary read)
    • Waits for a majority ack, ~40ms
    • Primary answers from the source of truth
    • Guaranteed to reflect any acknowledged write

Command

javascript
// MongoDB — the same insert, two latency/consistency points
db.orders.insertOne(doc, { writeConcern: { w: 1 } });          // fast
db.orders.insertOne(doc, { writeConcern: { w: 'majority' } }); // durable, slower

Nearest-replica read or w:1 write = fast, possibly stale. Primary/quorum read or w:"majority" write = current, but pays the round-trip to the slowest required replica. No partition involved in either — pure Latency-vs-Consistency, PACELC's "Else" branch.

3.Using PACELC as an evaluation checklist

To evaluate any replicated system with PACELC, ask two separate questions in order: (1) "If a partition happens, does this system stay available (PA) or does it stay consistent (PC)?" and (2) "With no partition, does it favor low latency (EL) or consistency (EC) on the read/write path I care about?" The answers combine into a four-letter label like PA/EL or PC/EC. This works as a checklist precisely because the two questions are independent and neither one alone answers the other.

Key features

  • Step 1: identify the partition-time behavior — does the system keep accepting requests (PA) or refuse/block until the partition heals (PC)?
  • Step 2: identify the normal-operation behavior on the specific read or write path being evaluated — low latency by default (EL) or wait for stronger consistency by default (EC)?
  • The two answers are independent: a system can mix them, e.g. DynamoDB defaults to fast eventually-consistent reads (EL) but also offers an opt-in strongly consistent read (moving that specific path toward EC).
  • Because PACELC is per-operation in systems with tunable consistency, the honest answer is often "it depends on the configuration used for this specific request," not one fixed label for the whole system.
  • Classic literature examples: early Dynamo, Cassandra and Riak are commonly cited as PA/EL; traditional single-leader relational databases like PostgreSQL and MySQL Cluster, along with Bigtable and HBase, are commonly cited as PC/EC.

The two-question checklist, worked for DynamoDB

The two-question checklist, worked for DynamoDB
QuestionWhat to checkDynamoDB's answer
1. Partition behaviorDoes it keep serving reads/writes during a network partition, or refuse?Designed to remain highly available under partition — PA
2. Normal-operation defaultWhat does the default read/write path favor with no partition?Eventually consistent reads are the default, favoring latency — EL
2b. Normal-operation opt-inIs there a per-request way to trade latency for consistency?ConsistentRead: true switches that one read to strongly consistent, at higher latency/cost
The three-question checklist

Partition behavior

PA or PC?

Normal-op default

EL or EC?

Per-request override

e.g. ConsistentRead

  1. Partition behavior — PA or PC?
  2. Normal-op default — EL or EC?
  3. Per-request override — e.g. ConsistentRead

Command

text
PACELC evaluation checklist for a replicated system:

1. Partition question:
   Under a network partition, does it stay
   available (PA) or stay consistent (PC)?

2. Normal-operation question (per read/write path):
   With no partition, does the default favor
   low latency (EL) or consistency (EC)?

3. Check for per-request overrides:
   Can a specific call opt into the other choice
   (e.g. a "strongly consistent" flag)?

Combine 1 + 2 into a label: PA/EL, PC/EC, PA/EC, PC/EL.

Evaluate in two independent steps: (1) partition behavior -> PA or PC, (2) normal-operation default on the path you care about -> EL or EC. Watch for per-request overrides (like DynamoDB's ConsistentRead) that shift only the second answer, for one call, without touching the first.

Remember

  • CAP only speaks during a partition. PACELC adds the "Else": with no partition at all, every replicated system still trades Latency against Consistency.
  • The partition-time choice (PA/PC) and the normal-time choice (EL/EC) are independent — a system can mix them, and often does per operation.
  • A nearest-replica read or a w:1 write is fast but possibly stale; a quorum read/write is current but pays the round trip to the slowest required replica — no partition needed for either.
  • Evaluate a system in two separate steps: partition behavior first, then normal-operation default, then check for per-request overrides (like DynamoDB's ConsistentRead flag).

Pro tip

  • Don't give a whole system one PACELC label — many real systems are tunable per request, so the honest label is often per-operation, not system-wide.
  • When someone cites a database's CAP letter (CP/AP) to explain its everyday latency, ask for its PACELC classification instead — CAP says nothing about behavior outside a partition.

Next up

  • Consistency models
  • Distributed locks
  • Sharding and partitioning

Sources

  • Abadi, "Consistency Tradeoffs in Modern Distributed Database System Design" (2012), via en.wikipedia.org/wiki/PACELC_design_principle
  • MongoDB write concern docs — mongodb.com/docs/manual/core/replica-set-write-concern
  • AWS DynamoDB read consistency docs — docs.aws.amazon.com
  • Checked 2026-08-22

Spotted a mistake on this page? Tell us.