The full picture
- Model the domain so conflicts can't exist, which beats resolving them: a like is a set insert (idempotent, commutative), a balance is a log of deltas rather than a mutable number, a counter is a G-Counter per replica summed on read. Most 'we need strong consistency' requirements dissolve once the data type stops being a mutable scalar.
- Optimistic UI is a consistency decision in disguise: showing the write as done before it's durable is exactly read-your-writes implemented client-side. It's the right default if you also handle the rollback path — the reconciliation UX (a toast, a retry, a merge prompt) is the part teams forget, and its absence is what makes eventual consistency feel broken.
- Bound the blast radius by scope: eventual across regions while linearizable within a region is a very common and defensible architecture — cross-region users tolerate seconds of lag; same-region users never see it. Choosing the boundary where the guarantee weakens is the real design work.
- Detect divergence actively: anti-entropy (Merkle-tree repair like Cassandra/Dynamo), read repair, and periodic reconciliation jobs comparing source-of-truth to derived stores. If you can't answer 'how would you know two replicas disagreed?', you have eventual consistency without eventual convergence.
- Some operations simply cannot be eventual: uniqueness constraints (usernames), limited inventory, and anything with regulatory or money semantics need coordination — either consensus, or a single-writer partition that owns the invariant. Say which of your operations are in this set and route them differently.
| Data shape | Conflict rule | Risk |
|---|---|---|
| Set membership (likes, tags) | OR-Set CRDT / union | low — merges are natural |
| Counter (views, votes) | per-replica G-Counter, sum on read | low, but no exact real-time total |
| Text document | CRDT / OT (Yjs, Automerge) | medium — library complexity |
| Mutable record (profile) | LWW per field, HLC timestamp | silent data loss on concurrent edits |
| Money / inventory | don't — use consensus or single-writer | correctness, not UX |