添加/删除集CRDT的内部是单调的,因为我们只添加到内部集,因此CRDT的内部状态不能在逻辑时间内倒退。
然而,观察到的CRDT状态是我们添加和删除元素,因此观察到的状态不必是单调的。
如果我们将这些系统链接在一起并根据元素的存在或非存在来采取行动,它就不再具有单调性。最终的状态最终仍会收敛,但在稳定之前,我们可能会或可能不会看到一些元素。由于该中间状态,例如用户读取系统状态并在其收敛之前作出反应,因此发生某些副作用并非不太可能。
CRDT单调意味着什么?
答案 0 :(得分:2)
只需添加一个TL; DR就在alekibango的精彩回答之上:
单调性是指一旦操作被复制品观察和应用,对象的状态将始终考虑该操作。
一旦应用了一个操作,它将永远不会被应用。
观察到的(大多数)CRDT集的非单调性不会使CRDT单调性质无效。
支持remove
操作的CRDT集合的核心是两个G-Sets:
观察到的状态是添加元素的集合减去已删除元素的集合。尽管每个内部组合都明显是单调的,但它们之间的区别似乎是非单调的。
答案 1 :(得分:1)
CRDT表示无冲突复制数据类型
这意味着(分歧)CRDT的实例可能合并在一起(无论顺序和重复),最终进入正确,一致的状态。
单调性可能有助于实现这一点(请参阅CALM - 一致性作为逻辑单调性)。但这不是您的集合实例的要求。
阅读有关crdt:https://github.com/pfrazee/crdt_notes
的说明CRDT集的一些示例是:
一些链接可以阅读更多内容: