Skip to content

因果一致性

Causal consistency · Causal memory

要求每个观察者的读写可见顺序都扩展程序顺序与读来源所生成因果偏序的一致性模型。

形式陈述

在复制或共享内存系统中,先把一次读写执行投影为带会话标识、对象、值与 reads-from 关系的操作序列 H,再为写操作与观察事件建立因果关系。基本边通常至少包括同一客户端会话内的程序顺序,以及 reads-from 边:若读 r 返回写 w 产生的值,则 wr。再取这些边的传递闭包,并把读后发出的写纳入程序顺序,便可得到写之间的因果依赖;例如 w1rw2 表示 w2 的发起者已经观察并可能依赖 w1

历史满足因果一致性,粗略说是每个进程或客户端的可见序都必须扩展这一因果偏序:若 w1w2,任何观察到 w2 的参与者都不能在自己的合法视图中遗漏 w1,也不能把 w2 排在 w1 之前。对因果上并发的写 ww,模型不要求所有观察者采用同一先后;不同副本可以先看到不同写,只要各自读值能由一个保持因果关系的顺序历史解释。

不同论文对读操作是否进入序关系、同一写是否必须立即可见、冲突写如何选值采用不同形式化。完整规格需要固定对象的顺序语义、写的唯一标识、reads-from 关系、会话迁移方式与可见性闭包。Lamport 因果关系提供数学骨架,但存储系统还要说明哪些客户端观察生成边;物理时间较早或先到达某副本,本身都不是因果证据。

基本因果一致性不包含最终传播、并发更新收敛、读己之写、单调读或实时新鲜度等全部体验。会话保证可以从恰当维护的因果上下文导出,也可以由 API 单独承诺;causal+ 一类加强还要求并发冲突以确定方式收敛。若把这些附加条款直接塞进基本定义,就无法准确比较只保因果序与同时保收敛的系统。

直觉

因果一致性保护“先有原因,后有结果”的可见叙事。客户端根据一条帖子写出回复,回复便携带对原帖的依赖;任何展示回复的副本都应先具备原帖。两位互不观察对方的用户独立发帖则没有信息流,系统无需为他们支付全局定序成本。

放弃并发写的统一顺序,是因果一致性获得低协调和地理可用性的关键。每个观察者都读到一个尊重依赖的世界,却不必立即与所有其他观察者共享同一条总历史;这比顺序一致性弱,也比只承诺最终收敛多了一层中间可见性约束。

例子与边界

用户 A 发布帖子 p。用户 B 读到 p 后发布回复 r,于是 pr。副本即使先从网络收到 r,也必须暂缓对外显示,直到 p 可见;否则客户端会看到对不存在内容的回复。若用户 C 与 D 在互不通信时各自发布独立帖子 x,y,一个副本按 x,y 展示、另一个按 y,x 展示都符合因果一致性。

仅让每个发送者的更新 FIFO 到达不足以捕获跨客户端依赖:B 的回复由另一发送者产生,却依赖 A 的帖子。系统可用版本向量、显式依赖集合或因果广播传播这一关系;广播是消息交付规格,存储一致性仍需把交付结果映射为版本可见性和读返回值,两者不能直接等同。

因果一致性也不自动带来收敛。两个副本并发写同一字段,各自先显示本地值;即使所有因果依赖都按序传播,若冲突处理采用“收到即覆盖”,交换更新后仍可能留下相反结果。最终一致性或 CRDT 合并规则负责停止更新后的收敛,因果一致性负责传播期间不颠倒依赖,两个维度可以单独成立或同时提供。

推论与应用

因果一致存储通常让客户端携带一个因果上下文,写操作继承此前读到的版本,副本只在依赖满足后公开新版本。会话跨副本迁移时若丢掉上下文,新副本可能无法知道客户端已经观察了什么;sticky session、依赖令牌或版本向量分别以不同方式保存这份信息。

协作应用、社交时间线与离线优先系统常能接受并发更新暂时异序,却不能接受回复先于原文、撤销先于操作等因果倒置。是否还需要统一冲突结果、实时读取或事务原子性,应作为独立规格叠加,而不是从“causal”标签中推断。

参考资料
  • Phillip W. Hutto and Mustaque Ahamad, “Slow Memory: Weakening Consistency to Enrich Concurrency,” ICDCS 1990, pp. 302–311。
  • Mustaque Ahamad et al., “Causal Memory: Definitions, Implementation, and Programming,” Distributed Computing 9, 1995, pp. 37–49。
  • Wyatt Lloyd et al., “Don’t Settle for Eventual: Scalable Causal Consistency for Wide-Area Storage with COPS,” SOSP 2011, pp. 401–416。