Distributed systems differ not only in what they store but in how they order events. Every read, write, and replica update follows an underlying ordering guarantee, a rule defining how operations appear across replicas.
As these guarantees strengthen, systems exchange availability and latency for stronger forms of consistency. Every distributed system must choose how much order it can really afford.
Let’s climb this ladder of consistency, starting from the weakest.
Eventual Consistency — When Order Doesn’t Matter
Ordering guarantee
No global or causal ordering enforced. Replicas can apply updates in any order and may temporarily diverge.
Consistency model
Given enough time and no new writes, all replicas eventual converge.
How it’s achieved
• Gossip protocols exchange updates between nodes.
• Read repair and anti-entropy sync reconcile differences.
• Conflict resolution via timestamps or CRDTs (conflict-free replicated data types).
Example
Alice writes X=1, then X=2. Charlie might read 2, then later 1, depending on which replica he contacts. Eventually, all replicas agree on X=2.
What you gain: Maximum availability and throughput.
What you lose: Predictability, as reads can return anything until convergence.
Read My Writes — Seeing Your Own Updates
Ordering guarantee
Each client’s own writes are applied in the order they were issued, and that client’s subsequent reads must reflect those writes. Other clients may still see those updates later or in a different order.
Consistency model
A client always sees the effects of its own writes in subsequent reads, even if those writes haven’t yet propagated to other replicas.
How it’s achieved
• Use sticky sessions, routing all of a client’s reads and writes to the same replica.
• Apply write-through policies to ensure local visibility before acknowledging success.
Example
Alice posts “Hello World.” Even if replication lags, she’ll see her post when refreshing her feed.
What you gain: A consistent, predictable view of your own actions. Your updates are always visible to you.
What you lose: No shared global order. Different users may see updates in different sequences.
Monotonic Reads — Never Going Backwards
Ordering guarantee
The system preserves a client’s personal reading order. Values you’ve already seen remain visible or newer, never older.
Consistency model
Monotonic reads ensures your view of the data only moves forward, never backward.
How it’s achieved
• Keep session stickiness or remember the latest version seen.
• Ensure subsequent reads are served from replicas at least that fresh.
Example
Bob checks his account balance and sees £100. A few seconds later, he checks again on another replica, which hasn’t yet applied the £100 update. The system either waits for the lagging replica to catch up or redirect the read to a fresher replica.
What you gain: Predictability in your own reads. The data you see only gets fresher over time.
What you lose: Coordination across clients. Your monotonic view might differ from others’.
Consistent prefix/Causal Consistency — Preserving Cause and Effect
Ordering guarantee
If one operation causally depends on another, everyone must see them in that order. Concurrent operations may appear in different orders.
Consistency model
Replicas preserve cause and effect: you never see an effect without first seeing its cause.
How it’s achieved
• Track dependencies using vector clocks or causal metadata.
• Use causal broadcast protocols that delay delivery until prerequisites are met.
Example
Alice debits £100, then credits £100. Bob can’t see the credit without the debit i.e., cause before effect.
What you gain: Logical correctness of related operations.
What you lose: A single, globally consistent sequence.
Sequential Consistency — Everyone Agrees on an Order
Ordering guarantee
All operations appear in the same total order across replicas, though not necessarily in real-time order.
Consistency model
All clients agree on one global sequence that respects each client’s own order.
How it’s achieved
• Implement Total Order Broadcast (TOB) or a replicated log.
• Every node applies operations in that shared sequence.
Example
Time | Client | Operation |
---|---|---|
10:00:00 | Alice | writes X = 1 |
10:00:01 | Bob | reads X |
Alice writes X=1; Bob’s read may still return 0 if his operation is earlier in the global log i.e., Bob.read(X=0), Alice.write(X=1). This is totally legal because because each client’s operations appear in their own program order. What's guaranteed, however, is that all clients agree on that same sequence once it's established.
What you gain: Cluster-wide agreement on operation order.
What you lose: Real-time alignment. An operation that happens later in wall-clock time might still appear earlier in that global order.
Bounded Staleness — Consistency with a Time Limit
Ordering guarantee
Same total order as sequential consistency, but replicas are allowed to lag within a known bound i.e., either in time or number of versions.
Consistency model
Reads may be out-of-date, but only within a predictable limit.
How it’s achieved
• Replicas follow the same sequence of writes, delayed by at most k versions or t seconds.
• Implemented using version clocks, commit timestamps, or bounded clock skew (as in Google Spanner and Cosmos DB).
Example: Bounded Staleness
Time | Replica | Operation | Observed Value of X | Notes |
---|---|---|---|---|
10:00:00 | Alice (Leader) | writes X = 1 |
1 | Latest committed value |
10:00:02 | Replica A | not yet updated | 0 | 2 seconds behind |
10:00:05 | Replica B | applies update | 1 | Now caught up |
10:00:09 | Bob (reads from Replica A) | reads X |
0 | Still stale but within 10s bound |
10:00:11 | Replica A | syncs to version 1 | 1 | Update applied within allowed lag |
10:00:12 | Bob (reads again) | reads X |
1 | Now fully consistent |
Bob’s read at 10:00:09 sees stale data (X=0), but it’s only 9 seconds after the write — within the 10 second bound, so it’s allowed.
Example: Bound violated
Time | Replica | Operation | Observed Value of X | Notes |
---|---|---|---|---|
10:00:00 | Alice (Leader) | writes X = 1 |
1 | Latest committed value |
10:00:15 | Replica A | still stale | 0 | 15 s behind → violates 10 s bound |
10:00:15 | Bob (reads from Replica A) | reads X |
— | Read must block, retry, or redirect |
10:00:16 | Replica A | syncs to version 1 | 1 | Replica catches up |
10:00:17 | Bob (reads again) | reads X |
1 | Allowed once bound satisfied |
At 10:00:15, Replica A is 15 seconds behind, exceeding the configured 10 second staleness window. When Bob reads, the system must delay, retry, or redirect the read to a fresher replica. Returning X=0 here would violate the bounded-staleness contract.
What you gain: Predictable lag and lower latency. A practical compromise between freshness and performance.
What you lose: Strict real-time alignment.
Linearizability — Real-Time Global Truth
Ordering guarantee
Extends total order with real-time awareness. If one operation completes before another begins, every process observes them in that order.
Consistency model
Every read returns the most recent committed value.
How it’s achieved
• Use consensus protocols (Raft, Paxos) to totally order operations.
• Wait for quorum acknowledgements before committing writes.
Example
Alice writes X=1. Bob immediately reads and always sees 1. The system may block his read until all replicas agree on that write.
What you gain: Simplicity and real-time correctness. Reads always reflect the latest state.
What you lose: Latency and availability during network partitions.
The Ladder: From Weak to Strong
Each step up this ladder adds coordination and reduces uncertainty: from gossip to quorum, from local perception to shared truth. As guarantees strengthen, availability drops, latency rises and predictability improves.
Eventual consistency powers high-throughput systems like social feeds and caches while linearizability anchors control planes, configuration stores, and financial systems where correctness is non-negotiable. In the end, every distributed system simply chooses how much order it can afford.
Consistency Model | Underlying Ordering Guarantee | How It’s Enforced | Example Systems |
---|---|---|---|
Eventual consistency | No ordering | Gossip, anti-entropy, CRDTs | Dynamo, Cassandra, Riak |
Read-my-writes | Per-client order | Sticky sessions, write-through | Web apps, caches |
Monotonic reads | Per-session order | Session stickiness, version tracking | Cassandra, Cosmos DB |
Consistent prefix | Causal order | Vector clocks, causal broadcast | Cosmos DB, AntidoteDB |
Sequential consistency | Total order | Replicated log, Total Order Broadcast (TOB) | ZooKeeper, etcd |
Bounded staleness | Total order + bounded delay | Version vectors, delayed replicas, bounded clocks | Cosmos DB, Spanner |
Linearizability | Real-time total order | Quorums, TrueTime, Paxos/Raft | Spanner, etcd (strict mode) |
Beyond the Ladder: Stacking Consistency Models by Scope
The ladder of consistency shows how systems strengthen their ordering guarantees i.e., from eventual to linearizable. But real-world systems don’t stop at one rung. They often combine multiple consistency models, each governing a different aspect of behaviour.
Consistency models don’t all compete in the same dimension. Some define how replicas agree, others define what a single client experiences, and yet others constrain how fresh the data must be when served.
When two models operate at different scopes, they don’t contradict one another. They describe orthogonal dimensions of consistency and can safely be stacked together. That’s what stacking by scope means.
Scope | Examples | What It Controls | Can Be Combined With |
---|---|---|---|
Global (replica ordering) | Eventual, Causal, Sequential, Linearizable | How replicas agree on the order of operations. | Session-level or freshness models. |
Session / Client (user continuity) | Read-My-Writes, Monotonic Reads, Writes-Follow-Reads | How a client experiences its own updates across replicas. | Any global ordering model. |
Temporal (freshness / staleness) | Bounded Staleness, Strong (Linearizable) | How fresh or delayed a read may be relative to the latest write. | Global + session-level models. |
A distributed database can layer different scopes of consistency to achieve more practical, user-friendly guarantees:
• At the global scope, it may enforce Causal Consistency so replicas preserve cause-and-effect ordering.
• At the session scope, it can apply Read-My-Writes and Monotonic Reads, ensuring each client’s view of data moves forward without regression.
• At the temporal scope, it might add Bounded Staleness, guaranteeing reads are never older than a defined time or version window.
Together, these layers form a cohesive Session Consistency model, a practical blend of global order, personal continuity, and predictable freshness.
References