Skip to content

状态型 CRDT 的并半格

Join-semilattice state for CRDTs · CRDT join-semilattice · CRDT 并半格状态

以最小上界作为确定合并结果、从而吸收乱序与重复状态传播的 CRDT 状态空间。

条目类型
定义

形式陈述

状态型 CRDT 的状态空间取为偏序集 (S,),并要求任意 x,yS 都有最小上界 xy;这正是一个 join-半格。合并定义为

merge(x,y)=xy.

join 自动满足

x(yz)=(xy)z,xy=yx,xx=x.

结合性消除分组差异,交换性消除到达顺序差异,幂等性消除重复传输差异。反过来,若一个二元运算满足这三条定律,可用

xyxy=y

恢复偏序,运算就是该序下的最小上界。CRDT 证明因此既可从偏序出发,也可直接验证代数定律。

实际状态空间常有底元素 作为初始状态,满足 x=x;底元素便于初始化,但 join-semilattice 的定义本身不强制存在全局底。多个半格可以逐分量组成乘积半格,有限映射可用缺失键的默认底值并逐键取 join,幂集则以包含关系排序、集合并为 join。这些构造让复杂 CRDT 的收敛证明可由局部部件组合。

直觉

xy 读作“y 至少包含 x 已知的全部信息”。合并不是在两个冲突版本中任意选赢家,而是寻找同时覆盖二者、又不添加无根据内容的最小状态。副本沿不同网络路径收到同一批信息,最终都落在这些信息的 join;消息树怎样分叉、重传和重组不再影响结果。

“向上”是由信息语义决定的,不必等同数值变大。集合删除可以通过增加“某个 add 已被删除”的因果证据实现;寄存器覆盖也可通过增加带新 dot 的版本并记录旧 dot 已见来实现。若直接从集合里拿掉元素而不保留证据,偏序信息会倒退,旧状态稍后到达便可能把元素复活。

半格只解决确定合并。它没有规定本地更新一定向上,也没有保证每份信息最终传播,更没有规定读操作的业务含义;这三项分别由膨胀更新、传播协议和 query 函数承担。

例子与边界

取状态空间 N2,偏序与 join 都逐分量定义:

(a1,a2)(b1,b2)a1b1a2b2,(a1,a2)(b1,b2)=(max(a1,b1),max(a2,b2)).

三个副本状态分别为 x=(2,0)y=(1,3)z=(2,1)。先合并 x,y(2,3),再合并 z 仍为 (2,3);先合并 y,z 也得 (2,3),重复加入 x 不变。这个计算同时见证结合、交换与幂等,并构成 G-Counter 的两副本状态空间。

若误把 merge 定为逐分量加法,则 (2,0) 与自身重传一次会从 (2,0) 变成 (4,0),幂等性失败。若 merge 取“收到的右参数”,结果又随消息顺序变化。若状态是普通整数而 merge 取最大值,本地允许从 5 更新成 3,稍后与旧状态 5 合并会恢复成 5;算法仍收敛,却没有实现用户以为的覆盖语义。

全格比本页要求更强: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.
关系图谱4 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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