“设 $(S,\sqsubseteq,\sqcup)$ 是状态型 CRDT 的并半格。本地 mutator $m:S\to S$ 称为膨胀的,若”
形式陈述 ​
状态型 CRDT 的状态空间取为偏序集
join 自动满足
结合性消除分组差异,交换性消除到达顺序差异,幂等性消除重复传输差异。反过来,若一个二元运算满足这三条定律,可用
恢复偏序,运算就是该序下的最小上界。CRDT 证明因此既可从偏序出发,也可直接验证代数定律。
实际状态空间常有底元素
直觉
把
“向上”是由信息语义决定的,不必等同数值变大。集合删除可以通过增加“某个 add 已被删除”的因果证据实现;寄存器覆盖也可通过增加带新 dot 的版本并记录旧 dot 已见来实现。若直接从集合里拿掉元素而不保留证据,偏序信息会倒退,旧状态稍后到达便可能把元素复活。
半格只解决确定合并。它没有规定本地更新一定向上,也没有保证每份信息最终传播,更没有规定读操作的业务含义;这三项分别由膨胀更新、传播协议和 query 函数承担。
例子与边界
取状态空间
三个副本状态分别为
若误把 merge 定为逐分量加法,则
全格比本页要求更强:meet 是否存在与状态合并无关。相反,只有某些状态对拥有上界也不够;并发可达的任意两状态都必须能合并,否则分区期间合法产生的版本可能在愈合时无定义。
推论与应用
并半格为状态压缩提供明确责任:压缩函数若保持相同的抽象信息顺序与 join 结果,便可更换表示;若丢掉删除证据或把不同点误合并,就会破坏收敛或语义。产品半格、映射半格与带因果上下文的 powerset 半格分别支撑计数器、按键对象和 observed-remove 集合。
该代数还让测试超越几组网络轨迹。对有限生成状态可做 property-based testing,随机验证 join 的三条定律与 query 在等价状态上的一致性;但有限测试不能替代对无界 dot、整数溢出和回收协议的证明。
参考资料
- Marc Shapiro, Nuno Preguiça, Carlos Baquero, and Marek Zawirski, “A Comprehensive Study of Convergent and Commutative Replicated Data Types,” INRIA Research Report RR-7506, 2011, Secs. 2–3.
- B. A. Davey and H. A. Priestley, Introduction to Lattices and Order, 2nd ed., Cambridge University Press, 2002, Chs. 1–2.
- Paulo Sérgio Almeida, “Approaches to Conflict-Free Replicated Data Types,” ACM Computing Surveys 56(3), Article 76, 2024, Secs. 2–3.