CAP and PACELC

The CAP theorem is the most cited and most misunderstood result in distributed systems. It does not say "pick two of three." It says something narrower and more useful: when the network partitions, you must choose between consistency and availability — and PACELC completes the picture by asking what you trade even when it doesn't.

Every distributed data system eventually confronts one unavoidable question: when nodes can’t talk to each other, do you keep serving requests (and risk returning stale or conflicting data), or do you refuse to serve (to protect correctness)? The CAP theorem formalizes that this is a genuine dichotomy, not an engineering failure you can design away. Understanding it precisely — and its extension, PACELC — is what lets you read a database’s guarantees honestly instead of by its marketing.

What CAP actually says

CAP concerns three properties of a distributed data store:

The theorem: when a partition occurs, a system cannot be both consistent and available. If two nodes can’t communicate and a write lands on one, the other must either return possibly-stale data (choosing A, sacrificing C) or refuse to answer (choosing C, sacrificing A). There is no third option, because the two nodes physically cannot coordinate.

The “pick two” framing is wrong

The popular “pick two of C, A, P” phrasing is misleading, because P is not optional. Network partitions are a fact of the physical world — cables cut, switches fail, packets drop — so any real distributed system must tolerate them. You don’t choose whether partitions happen; you only choose how to respond when they do.

So the honest statement is: a distributed system must be partition-tolerant, and therefore, during a partition, it must choose between C and A. That reduces the taxonomy to two meaningful kinds of system:

Note that “CA” — consistent and available but not partition-tolerant — describes a single-node system or one that simply hasn’t partitioned yet; it isn’t a real option for a distributed system.

The trade-off is not all-or-nothing

CAP is stated in absolutes, but production systems make the choice at finer granularity. A single system can be CP for some operations and AP for others — refuse a “deduct from balance” during a partition but keep serving “show product page.” Many databases expose the trade-off as a tunable per request: quorum settings (the subject of the replication post) let you dial toward consistency or availability read-by-read and write-by-write. And the choice interacts directly with the consistency models from the last post: an AP system doesn’t abandon consistency entirely, it drops from linearizability to eventual/causal and leans on session guarantees. CAP tells you the extremes you’re forced between during a partition; real systems live on a dial between them.

PACELC: the half of the story CAP omits

CAP only describes behavior during a partition — which is rare. It says nothing about the normal case, when the network is healthy, yet that case dominates your system’s life. PACELC completes the picture:

If there is a Partition, trade between Availability and Consistency (the CAP choice); Else (normal operation), trade between Latency and Consistency.

The second clause is the one you feel every day. Even with no partition, a system that guarantees strong consistency must coordinate replicas on each operation, and that coordination costs latency. A system willing to relax consistency can answer from the nearest replica immediately, buying lower latency. So the real, always-present trade-off is latency vs. consistency; the partition case is the rare, dramatic version of the same tension.

PACELC gives a sharper vocabulary for classifying systems:

The lesson: don’t evaluate a datastore only by “what happens during a partition.” Ask what it costs you in latency the other 99.9% of the time, because that’s the trade you pay continuously.

Using this in practice

CAP and PACELC aren’t trivia — they’re a lens for design decisions:

The next posts give you the machinery behind these choices: how ordering is established without a shared clock, how replication actually distributes data, and how consensus lets nodes agree despite all of the above.

Key takeaways

Further reading

Sources & References