添加/删除设置CRDT的单调性吗?

时间:2018-02-25 14:50:51

标签: data-structures distribution crdt

添加/删除集CRDT的内部是单调的,因为我们只添加到内部集,因此CRDT的内部状态不能在逻辑时间内倒退。

然而,观察到的CRDT状态是我们添加和删除元素,因此观察到的状态不必是单调的。

如果我们将这些系统链接在一起并根据元素的存在或非存在来采取行动,它就不再具有单调性。最终的状态最终仍会收敛,但在稳定之前,我们可能会或可能不会看到一些元素。由于该中间状态,例如用户读取系统状态并在其收敛之前作出反应,因此发生某些副作用并非不太可能。

CRDT单调意味着什么?

2 个答案:

答案 0 :(得分:2)

只需添加一个TL; DR就在alekibango的精彩回答之上:

单调性是指一旦操作被复制品观察和应用,对象的状态将始终考虑该操作。

一旦应用了一个操作,它将永远不会被应用。

观察到的(大多数)CRDT集的非单调性不会使CRDT单调性质无效。

支持remove操作的CRDT集合的核心是两个G-Sets:

  • 其中一个G-Sets是添加的元素集。
  • 另一个G-set是已删除的元素集。

观察到的状态是添加元素的集合减去已删除元素的集合。尽管每个内部组合都明显是单调的,但它们之间的区别似乎是非单调的。

答案 1 :(得分:1)

CRDT表示无冲突复制数据类型

这意味着(分歧)CRDT的实例可能合并在一起(无论顺序和重复),最终进入正确,一致的状态。

单调性可能有助于实现这一点(请参阅CALM - 一致性作为逻辑单调性)。但这不是您的集合实例的要求。

阅读有关crdt:https://github.com/pfrazee/crdt_notes

的说明

CRDT集的一些示例是:

  • G-set(仅限成长,仅添加项目)
  • 2P-set(保留墓碑,元素只能插入一次)
  • LWW-set使用时间戳标记添加/删除项目的“时间”,允许多次添加/删除项目。并发添加 并使用偏见决定删除。
  • OR-set - 类似于lww set,但使用唯一标签来确定我们要删除的元素。
  • 优化OR-Sets - 可以在没有很多墓碑的情况下使用,如果您的套装很大(并且有很多) 变化)。

一些链接可以阅读更多内容: