Skip to content
Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (The CAP Theorem) 5 min

Seth Gilbert, Nancy Lynch · ACM SIGACT News 2002

Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (The CAP Theorem)

A distributed system split by a network partition must choose: answer with data that might be stale, or refuse to answer at all. Gilbert and Lynch turned Brewer's conjecture into a two-page proof that still decides how every database you use behaves when the network breaks.

Read the original paper

Systems & Distributed · beginner · 5 min read

Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (The CAP Theorem)

In 2000, Eric Brewer gave a keynote at PODC arguing that a distributed data store cannot simultaneously guarantee three things engineers wanted all at once: strong consistency, full availability, and tolerance of network partitions. It was stated as a conjecture, backed by experience running Inktomi's search infrastructure, not a proof. Two years later, Seth Gilbert and Nancy Lynch at MIT turned it into an actual theorem, with a formal model and a short, tight proof. That paper is what most engineers mean today when they say "the CAP theorem."

The result is small, almost embarrassingly so for something this widely cited: two nodes, one write, one read, one dropped message. But it explains a decision every distributed database makes, often silently, and it is the reason Dynamo and Raft, both covered elsewhere on this site, land on opposite sides of the same tradeoff.

When a network partition splits a distributed system into two halves that cannot talk to each other, each half must choose between answering requests with data that might be stale (favoring availability) or refusing to answer until it can guarantee correctness (favoring consistency). It cannot do both. Since real networks partition sometimes, every distributed system has already made this choice, whether its designers said so or not.


Three words that need precise definitions

Gilbert and Lynch's contribution was not the idea, Brewer already had that, it was pinning down exactly what each of the three words means, precisely enough to prove something about them.

  • Consistency: every read receives the result of the most recent write, or an error. This is the strong, single-copy notion the paper calls atomic consistency (equivalent to what later literature calls linearizability), not the C in ACID, which is a different, weaker property about database constraints.

  • Availability: every request to a non-failing node must eventually receive a response, one that is not an error. A node that is up but refuses to answer is not available in this sense, even if it is technically still running.

  • Partition tolerance: the system continues to operate even when the network drops an arbitrary number of messages between nodes. The paper models this as an adversary who can delete any message sent between two nodes it has split apart.

Partition tolerance is the odd one out. Consistency and availability are properties you might choose to offer. Partition tolerance is closer to a fact about physics: on any network you don't fully control, links fail, switches misbehave, and packets get dropped. A system cannot opt out of partitions happening, it can only decide what to do when one does.

The proof, compressed to its essence

The paper's argument uses the smallest possible system: two nodes, G1G_1 and G2G_2, each holding a copy of some value xx. A partition cuts every message between them. A client writes x=v1x = v_1 to G1G_1. Because the network is partitioned, that write cannot reach G2G_2.

Now a different client asks G2G_2 to read xx. G2G_2 has exactly two options, and no third one exists:

  • Answer with the old value v0v_0. The request gets a response, satisfying availability, but that response is wrong given the write that already happened, so consistency is broken.

  • Refuse to answer until it can confirm the current value, by which point the partition may not even be resolved. Consistency stays intact, but the request that should have gotten a response did not, so availability is broken.

That is the entire proof. There is no clever protocol, no amount of engineering skill, that lets G2G_2 do both at once during the partition, because doing both requires information that the partition, by definition, is preventing from arriving. The theorem is a statement about information flow under failure, not about anyone's implementation being clumsy.

The moment a partition separates two nodes, a read on the isolated side must pick one: answer with possibly stale data (available) or refuse to answer (consistent).

The theorem is usually summarized as "consistency, availability, partition tolerance: pick two." That framing has stuck for twenty years and it is misleading. Partition tolerance is not a feature you can decline for a system with more than one node communicating over an unreliable network, which describes essentially every real distributed system. You cannot forbid the network from ever dropping a packet.

What the theorem actually restricts is narrower and more useful: the choice between consistency and availability only has to be made during an actual partition. The rest of the time, when the network is healthy, a well-built system can offer both. So "CP" and "AP" describe what a system does when things go wrong, not what it offers all the time.

Real systems leaning each direction. Raft-based systems like etcd and ZooKeeper give up availability during a partition to keep every read strongly consistent. Dynamo-style systems give up strict consistency to keep answering requests.

This is exactly the fork between the two systems papers this decision connects to. Raft elects a single leader and refuses to serve writes, sometimes even reads, without a majority quorum: a deliberate CP choice. Dynamo's "always writable" design and read-repair machinery are a deliberate AP choice, accepting temporary inconsistency to make sure the shopping cart never returns an error.

The theorem's sequel: PACELC

A fair criticism of CAP, raised most clearly by Daniel Abadi in 2012, is that it only describes behavior during a partition, but partitions are rare. Most of the time, a system is up and fully connected, and there is still a tradeoff to make: how much latency are you willing to pay for stronger consistency on every single request, partition or not?

Abadi's PACELC formalizes this: if Partitioned, choose between Availability and Consistency (the original CAP tradeoff); Else, choose between Latency and Consistency (a tradeoff that exists even on a perfectly healthy network, because synchronous replication to stay consistent always costs round-trip time). It is a more complete map of the same underlying design space, and it is worth knowing the name because you will see databases described as "PA/EL" (Dynamo, Cassandra) or "PC/EC" (spanner-style systems that pay latency for consistency even when healthy) in vendor documentation.

Why this still shapes every system design conversation

The CAP theorem is why "it depends" is frequently the honest answer to "should this database be strongly consistent." It reframes the question from a matter of engineering effort into a matter of what happens to be true when the network breaks, which is unavoidable at scale. Once you internalize it, reading any database's documentation changes: you start looking for the sentence that admits what it does during a partition, because that sentence tells you more about the system than almost anything else in the docs.

Key takeaways: a network partition forces a choice between availability and consistency, not before or after it, only during it. Partition tolerance itself is not optional at scale, so the real design decision is CP versus AP. PACELC extends the same thinking to the latency-versus-consistency tradeoff that exists even when nothing is broken.

Found this breakdown useful?

Share it with someone else wrestling with this paper.

Discussion0

Join the Discussion

Sign in to leave comments, reply to others, or like insights.

Sign In to ScaleDojo

No comments yet. Be the first to start the thread!

More Papers

Enjoyed this? Get more like it.

New paper breakdowns, levels, and one concept worth knowing, straight to your inbox.

No spam, ever. Unsubscribe in one click.

Enjoyed this content?

Your support keeps us creating free resources

We put a lot of hours into researching and writing these guides. If it helped you, consider buying us a coffee. Every bit goes toward keeping ScaleDojo's content free and growing.

$

One-time payment via Stripe. ScaleDojo account required.