形式陈述 ​
设
返回一个 delta-state
Delta 仍是同一半格中的状态元素,不是必须按一次、按顺序重放的 operation。多个 delta 可组成 delta-group
需要因果上下文的数据类型还要求 causal delta-merging。设副本
副本
直觉
全状态同步像每次寄整本账簿;delta-state 寄“能让账簿从旧状态增长到新状态的那一小页”,但这页使用的语言仍是账簿状态。它可以合并、缓存、重发和再分组,不具备 operation log 的执行次数语义。
Delta 大小取决于表示。G-Counter 一次增加只需发送本副本的新绝对分量;OR-Set remove 还要发送被移除 dots 的因果上下文,可能并不恒定小。把任何网络 diff 都叫 delta 不够:diff 必须是半格元素,并证明与原 mutator 的 join 效果相同。
区间 base 类似补丁的前置版本。对只增数据,漏掉 base 常只造成暂时缺项;对带删除或版本覆盖的因果数据,孤立 delta 只携带本次变化,并不重述 base 中的全部事实。接收者不能把它当成完整后继状态,更不能把带缺口的高序号 dot 直接压成连续版本向量。
例子与边界
两副本 G-Counter 状态为
B 当前状态为
重复收到
Base 条件可以直接在分量半格上复算。设源副本在区间起点为
Delta buffer 也不能无限覆盖尚未确认的区间后立即删除。伙伴确认的是摘要还是实际持久化状态、崩溃后确认是否保留,都会影响 eventual dissemination。一次 delta 丢失并不会因“delta 很小”自动修复;必须重传、由后继 delta-group 包含其信息,或最终进行 full-state repair。
推论与应用
Delta-state 允许在保留 CvRDT 乱序与重复容忍性的同时,把带宽从对象大小降到近期增长大小。实践中可周期聚合 delta、以 acknowledgment frontier 修剪 buffer,并在伙伴差距过大时回退到全状态传输。
优化正确性应比较抽象状态:对任意初态与更新序列,合并全部必要 delta 的结果必须等价于执行原 CvRDT mutator 后交换全状态。只比较最终 query 会漏掉未来 merge 所需的删除上下文。伙伴不同步时,发送方可依据 acknowledgment 选择连续 interval;不能从本地最新序号猜测对方 base。
参考资料
- Paulo Sérgio Almeida, Ali Shoker, and Carlos Baquero, “Delta State Replicated Data Types,” Journal of Parallel and Distributed Computing 111, 2018, pp. 162–173.
- Paulo Sérgio Almeida, Ali Shoker, and Carlos Baquero, “Efficient State-Based CRDTs by Delta-Mutation,” PaPoC 2015, Article 5.
- Vitor Enes, Paulo Sérgio Almeida, Carlos Baquero, and João Leitão, “Efficient Synchronization of State-Based CRDTs,” ICDE 2019, pp. 148–159.