Eventual Consistency

Eventual consistency is a guarantee about one data object: the canonical formulation is that “if no new updates are made to the object, eventually all accesses will return the last updated value.” Vogels describes it as a specific form of weak consistency, and it is easy to misread.

Three things in that sentence carry the design consequences.

It is scoped to an object, not to the system. The quiescence condition applies per key, so a store under continuous write load can still have any individual record converge moments after its last update โ€” which is why the guarantee is usable in production rather than merely theoretical. Reading it as “the whole system must go idle” makes it sound vacuous, and that is a misreading.

There is no bound on eventually. The promise holds whether convergence takes ten milliseconds or an hour. The published position carries a precondition worth reading twice: “if no failures occur, the maximum size of the inconsistency window can be determined based on factors such as communication delays, the load on the system, and the number of replicas involved in the replication scheme.” Under failure the window is open-ended, and if propagation is lost with no repair mechanism there is no convergence at all.

Convergence is a property of the replication machinery, not of the label. Durable propagation that survives a crash, a defined resolution for conflicting writes, and a way to detect and repair what was missed are what make the promise true. Calling a design eventually consistent does not supply any of them.

It also says nothing about what a reader sees before convergence. Successive reads can move backwards in time, a value can reappear after seeming to change, and two users looking at the same record can see different things. None of these violate the guarantee, which is why eventually consistent is an incomplete answer to whether a design is safe.

What makes it worth choosing is the coordination it removes from the read path: a replica can answer without checking with anyone, which is what keeps reads fast and available. For workloads where a stale read is an inconvenience rather than an error โ€” a view counter, a recommendation list, a cached profile โ€” that is an excellent trade.

What it does not by itself buy is uncoordinated writes at every replica or availability during a partition. Those come from the write and quorum design, not from the consistency label. A single-primary database with asynchronous read replicas is eventually consistent and still refuses writes when the primary is unreachable; a multi-writer store accepts them everywhere and takes on conflict resolution as the price. Both sit under the same term, so eventually consistent tells you nothing about which one you have.

Where concurrent writes to the same key are allowed, something must resolve them, and the resolution rule is a design decision rather than a detail. Last writer wins is the common default, and it discards the losing write silently.

Ordering is a separate axis again. Causal consistency is described in the literature as a variation of eventual consistency that adds guarantees for causally related operations โ€” an access that follows a communicated update returns that update โ€” while “access by process C that has no causal relationship to process A is subject to the normal eventual consistency rules.” So it removes the class of anomaly where a reply appears before the message it answers. It does not remove every anomaly a user can notice, and it is not a substitute for deciding how conflicts resolve.

The useful discipline is to state a target for the convergence lag and measure it, so that “eventual” becomes a number someone owns. How to do that, and what to reconcile against, is worked through in Replication, Consistency, and Time.

References


Discover more from Insightful Data Lab

Subscribe to get the latest posts sent to your email.

Similar Posts

Questions, corrections, or additional insights?

This site uses Akismet to reduce spam. Learn how your comment data is processed.