Skip to content

最终一致性

Eventual consistency

停止更新后,所有副本最终收敛到一致状态的弱一致性保证。

条目类型
定义

形式陈述

最终一致性是复制系统的一类弱保证,其核心收敛条件应对执行序列陈述:若从某个执行位置起不再产生新更新,所有已经接受的更新最终交付给每个正确副本,并且执行继续推进,那么这条执行中存在一个有限位置,此后所有正确副本都处于等价状态,对同一读请求给出相同结果。这个位置可以随执行而变;定义不提供统一的墙钟时限,也不保证能在运行中预知还要等待多久。按安全性与活性的分类,这几乎是一条纯活性性质,也不对收敛完成前的任何一次读取作承诺——读到任意旧值都不违反规格。实际系统常在其上叠加会话保证(读己之写、单调读、单调写等)或 eventual delivery 等传播条款;因此"最终一致性"不是一个唯一确定的完备规格,而是一族需要逐条写明的性质的统称。一个重要的加强是强最终一致性:交付了相同更新集合的副本立即处于等价状态,把"最终"从时间承诺换成对更新集合的函数性承诺。

直觉

这一保证是用一致性换可用性的产物:在异步系统里更新传播需要不可预知的时间,若坚持每次读都返回全局最新值,副本就必须在分区或高延迟时拒绝服务;最终一致性反其道而行,允许副本在传播期间暂时分歧、继续各自应答,只承诺"风波平息后殊途同归"。恰当的心智模型是流言的扩散:消息终会传遍所有人,但在任一时刻不同人听到的版本可能不同。第一印象容易把它当成"稍微弱一点的一致性",实际落差更大——规格对"中间状态可以多离谱"完全沉默,读到几小时前的值、读到时新时旧来回跳的值,都符合字面定义;一切更强的体验都必须靠显式附加的条款来买。

例子与边界

正例:DNS 缓存是教科书案例——记录更新后,各地解析器在 TTL 内继续返回旧地址,随缓存过期与刷新,全网逐步收敛到新值;期间"新旧并存"完全合法。异步复制的键值存储同理:写入先在本地副本生效并确认,后台再传播到其余副本,宕机或分区不阻塞前台读写。

第一个边界:仅有"更新最终送达"不足以保证收敛。设两个副本并发写同一键,甲写 x=1、乙写 x=2,随后互相交换更新;若各自采用"收到就覆盖"的本地规则,甲最终存 2、乙最终存 1——消息都送达了,状态却永久分叉。收敛还需要确定性的冲突解决:全序时间戳(最后写入胜)、语义合并函数,或无冲突复制数据类型那样把交换性写进数据类型。第二个边界是会话体验:最终一致不蕴含单调读——同一客户端相继两次读可能先见新后见旧(例如两次请求落到不同副本),需要单独的会话保证来排除。

两个副本断网期间分别接收更新,恢复后通过反熵最终合并,符合最终一致性。若更新一直持续,定义不要求某个固定时刻完全一致。仅“偶尔同步”也不够:合并规则若非确定、非幂等或持续丢消息,副本可能永不收敛。

收敛与因果顺序彼此正交。系统可以最终收敛,却在传播期间先显示回复再显示原帖;也可以按因果一致性公开每个依赖,却因并发冲突没有确定合并而永不收敛。应用若同时需要二者,必须分别规定因果可见性、最终传播和冲突解决。

推论与应用

最终一致性是CAP 定理中选择可用性一侧后的常见语义,支撑地理复制数据库、离线协作应用与高可用缓存:分区期间照常服务,愈合后靠反熵同步与冲突解决收敛。线性一致性要求实时顺序,因果一致性约束依赖可见性;它们与最终收敛的量词不同,不能简单排成一个只有强弱标签的单轴。

设计与评审此类系统时,应把“最终一致”拆成收敛条件、冲突解决规则、因果保证和会话保证分别规格化,而不是让一个词替代全部语义。

参考资料
  • Werner Vogels, “Eventually Consistent,” Communications of the ACM 52(1), 2009, pp. 40–44,Full paper, eventual consistency and client-centric variants。
  • Marc Shapiro et al., “Conflict-Free Replicated Data Types,” SSS 2011,§§2–3, eventual and strong eventual consistency。
关系图谱7 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系