Skip to content

Observed-Remove Set CRDT

Observed-Remove Set · OR-Set · Add-wins set · 观察删除集合 CRDT

为每次添加分配唯一 dot,并让删除只移除调用者已经观察到的该元素 dots 的 add-wins 集合。

条目类型
模型

形式陈述

本页固定 operation-based OR-Set。副本状态是 live pair 集合

SE×D,

其中 dot dD 是一次 add 的全局唯一身份。源副本执行 add(e) 时生成新 dot d,广播 effector add(e,d);各副本执行它时加入 (e,d)

源副本执行 remove 时,prepare 先冻结自己已观察到的 tags:

Te={d:(e,d)S},

再广播 remove(e,Te);effect 只删除 {(e,d):dTe}。查询

contains(e)d (e,d)S.

协议依赖操作型 CRDT 的因果交付Te 中每个 add 必须在对应 remove 之前执行。并发 add 使用 remove 未观察到的新 dot,不在 Te 内,所以幸存;这就是 add-wins。两个 adds、两个 removes 以及 remove 与未被其列出的并发 add 都可交换。具体地,若 dTe,则

(S{(e,d)})({e}×Te)=(S({e}×Te)){(e,d)}.

经典 op-based 定理还要求 eventual delivery 和逻辑恰一次。若传输 at-least-once,重复 add 必须按 dot 去重;否则 remove 后迟到的 add 副本可能重新插入同一 pair。

直觉

删除元素名“x”没有说明删的是哪一次加入。OR-Set 把每次加入看成一张独立票据,remove 只能撕掉手中已经见过的票据。分区另一侧新开的票据不可能被当前 remove 预知,因此保留。

这个规则把并发冲突变成可检查的因果问题,而不是依赖消息到达顺序。所有副本最终拿到相同 add dots 和 remove tag sets 后,无论并发消息怎样穿插,live pair 集都相同。

Dot 不应被复用。若 actor 重启后再次产生 (A,7),旧 remove 针对的票据和新 add 无法区分,新添加可能被过去的删除吞掉。持久 counter 或新 incarnation ID 是数据语义的一部分。

例子与边界

A 添加 x,生成

add(x,a1).

B 收到它后执行 remove,冻结 Tx={a1}。与此同时,尚未见该 remove 的 C 并发执行 add(x,c1)。全体最终执行三个 effectors 后,状态为

{(x,a1),(x,c1)}{(x,a1)}={(x,c1)},

所以 x 存在。无论 C 的 add 在 B 的 remove 前还是后到达,c1Tx,结果不变。

若 C 先观察 B 的 remove,再添加 x,新 add 因果后继于 remove,同样产生新 dot 并使 x 再次存在;这是用户重新添加,不是并发冲突。若 B 的 remove prepare 在尚未看到任何 x 时运行,Tx=,它不会删除将来或并发的任何 add。

朴素 two-phase set 用 add-set 减 remove-set 且按元素名永久禁用重加,语义不同;朴素 LWW-set 又按 marker 选赢家。它们都不能只换名字叫 OR-Set。过早丢掉 remove 的去重或稳定性证据,还会让离线副本重传 a1 后复活 x。

推论与应用

OR-Set 适合成员标签、购物车和协作选择,其中并发 add 应优先。若业务需要 remove-wins,应让并发 remove 能覆盖未观察 add,必须使用不同因果机制和证明,不能把 Te 扩成“所有未来 tags”这种不可实现集合。Remove 多个元素时应冻结每个元素各自的 observed dots;只广播元素名会丢失同一 API 调用的因果边界。

状态型优化可把 live dots 与 causal context 合并,避免为每个删除永久保留显式 tombstone;其 merge 仍要区分“对方没见 dot”和“对方已见并删除 dot”。本页的 op-based 定义则把这一区分冻结在 remove effector 与交付合同中。

参考资料
  • Marc Shapiro et al., “A Comprehensive Study of Convergent and Commutative Replicated Data Types,” INRIA RR-7506, 2011, OR-Set specification.
  • Annette Bieniusa et al., “An Optimized Conflict-Free Replicated Set,” arXiv:1210.3368, 2012.
  • Paulo Sérgio Almeida, “Approaches to Conflict-Free Replicated Data Types,” ACM Computing Surveys 56(3), Article 76, 2024, Sec. 5.1.
关系图谱2 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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