我想为最终收敛的P2P文本编辑实现Logoot,但遇到了一些问题。
我对Logoot的理解是,对象之间的间隔(原始纸张中的文本行,但可以是字符或单词)可以根据无限制的标识符无限地划分。这意味着对象的位置不像WOOT中那样由其邻居确定(这需要墓碑),而是由沿着字符串长度的固定数值确定。结合唯一的站点标识符,这还可以为我们提供总订单,并最终实现融合。
但是...对同一位置进行同时编辑时,这不会引起问题吗?如果两个断开连接的客户端开始在相同的光标位置写新句子然后合并,则他们的句子很有可能会交织。
以下是我正在谈论的白板示例:
如您所见,站点B和站点C均根据Logoot的规则划分了“I”和“被征服”之间的间隔,从而为我们提供了(20,A)和(25,A)位置之间的随机点。但是,没有什么命令将这些点相对于彼此排序,导致它们在合并时混合。同时,由于保留了每个对象的因果关系链,因此基于邻居的算法可以解决此问题。
上面是一个小例子,但在更一般的情况下,请想象两个用户是否要在两个现有句子之间插入一个不同的句子。如果其中一个用户恰好处于离线状态,那么他们不应该回到困惑的状态!显然,为了保持意图,一个句子应该跟在另一句之后。
我在阅读本文时是否缺少某些东西,或者这是Logoot固有的缺点?
(此外,为什么会有记录的时钟值似乎在算法中未使用?该论文甚至指出,每个对象的标识符在没有时钟的情况下必然是唯一的。)
最佳答案
您是正确的,这是Logoot和LSEQ中的真正异常。它是否构成违反意图,取决于您对意图的定义。定义的扩展要求连续序列保持连续,除非它们被偶然的后续操作分开,这将具有直觉的意义。
时钟是不必要的。作者很可能使用(站点,时钟)对或Lamport时间戳作为其UUID,这与常规不同。一个站点永远不会创建两个相同的位置,因此不再需要比较时钟。 (假设消息是从站点按顺序接收的,这也是Logoot/LSEQ的其他方面所必需的。)
关于algorithm - 徽标CRDT : interleaving of data on concurrent edits to the same spot?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45722742/