一致性模型谱系

一致性模型描述并发读写时可观察到的保证强度,从线性一致、顺序一致、因果一致到最终一致逐级放宽;模型越弱,可用性与延迟表现通常越好。

一致性模型是什么

一致性模型描述并发读写时系统向调用方提供的保证强度,从线性一致、顺序一致、因果一致到最终一致逐级放宽。模型越弱,通常可用性与延迟表现越好,但应用需要处理的不一致场景越多。选择模型时真正要回答的是两个问题:业务能容忍多旧的数据,以及出现冲突时由谁负责解决。

模型谱系

模型保证典型代价
线性一致读写像在单副本上实时执行跨节点协调,延迟高,分区时可能不可用
顺序一致所有节点看到相同的操作顺序需要全局定序,实现复杂
因果一致有因果关系的操作顺序保持一致中等,常作为折中选择
读己之写同一会话能读到自己的写入实现简单,跨会话仍可能读到旧值
最终一致停止写入后副本最终收敛读到旧数据的窗口不可控

基本信息

常见弱化手段读写分离、多副本异步复制、本地缓存
冲突解决最后写入胜出、版本向量、业务规则合并
可观测复制延迟、收敛时间纳入监控指标
与 CAP 关系模型选择实质上是分区时取舍的具体化
文档要求不写“强一致”这类模糊表述,写清具体模型与边界

典型使用场景

  • 架构评审:明确每条链路的一致性要求,而不是笼统要求强一致
  • 读写分离设计:为读延迟设定可接受的窗口并监控
  • 跨地域部署:为就近读取接受一定延迟,用会话内读写保证体验
  • 缓存策略:明确缓存失效时间与允许的陈旧窗口
  • 多副本数据库选型:按业务能否处理冲突挑选复制模式
  • 故障恢复设计:为恢复期的不一致准备补偿与对账流程
端到端的一致性强度取决于链路中最弱的一段:调用链上任何一个环节用了最终一致存储,整体就不再是强一致。
文档只写“强一致”而不说明具体模型,评审时双方对同一句话的理解可能完全不同。

易错点

  • 文档只写强一致不说明具体模型,评审与实现口径不一致
  • 跨服务链路各段模型不同,端到端保证被削弱到最弱一段却无人指出
  • 读写分离后立刻回查刚写入的数据,用户看到“保存失败”而反复提交
  • 缓存无失效策略,数据更新后长时间读到旧值且无人察觉
  • 多副本冲突解决依赖时间戳,时钟偏移导致后写的数据被旧写入覆盖

数据来源与参考

  • Jepsen 一致性模型参考(jepsen.io/consistency)
  • 《数据密集型应用系统设计》(Kleppmann)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌