Logoot CRDT:将并发编辑的数据交错到同一个地点?

时间:2017-08-16 20:47:28

标签: algorithm concurrency text-editor convergence crdt

我想为最终收敛的P2P文本编辑实现Logoot,我遇到了一些问题。

我对Logoot的理解是,对象之间的间隔(原始文件中的文本行,但可以是字符或单词)可以由于无界标识符而无限分割。这意味着对象的位置不是由其邻居确定的,如在WOOT中(这将需要墓碑),而是由沿着字符串长度的固定数字点确定。结合唯一的站点标识符,这也为我们提供了一个总订单,并最终实现了收敛。

然而......当对同一个点进行并发编辑时,这不会导致问题吗?如果两个断开连接的客户端开始在同一光标位置写入新句子然后合并,则他们的句子很有可能进行交错。

下面是我正在谈论的白板示例:

Whiteboard

正如您所看到的,站点B和站点C都根据Logoot的规则划分“I”和“conquered”之间的间隔,给出了(20,A)和(25,A)之间的随机点。 )。但是没有任何东西相对于彼此命令这些点,导致它们在合并时混合。同时,基于邻居的算法可以解决这个问题,因为保留了每个对象的因果链。

以上是一个婴儿示例,但在更一般的情况下,想象一下,如果两个用户想要在两个现有句子之间插入不同的句子。如果其中一个用户碰巧离线,他们不应该回到乱七八糟的混乱!显然,为了保持意图,一句话应该跟随另一句。

我在阅读报纸时遗漏了什么,或者这是Logoot的内在缺点?

(另外,为什么在算法中看似未使用的记录时钟值?本文甚至指出每个对象的标识符在没有时钟的情况下必然是唯一的。)

1 个答案:

答案 0 :(得分:1)

您是正确的,这是Logoot和LSEQ中的真正异常。它是否构成违反意图,​​取决于您对意图的定义。定义的扩展要求连续序列必须保持连续,除非它们被偶然的后续操作分开,这将是直观的。

不需要时钟。作者很可能不习惯将(站点,时钟)对或Lamport时间戳用作其UUID。一个站点永远不会创建两个相同的位置,因此不再需要比较时钟。 (假设从站点按顺序接收到消息,这也是Logoot / LSEQ的其他方面所必需的。)