为什么Google Docs的操作转换在删除方面有误?

ehf*_*eng 5 real-time google-docs google-wave operational-transform google-drive-api

今天尝试了这个实验:为Google文档打开了两个离线编辑器.在其中一个,我加粗了第一个字.在第二个,我删除了它.无论我先打开哪个客户端,该字总是会被删除.

首先,为什么会这样 - 我对运营转型的理解是订购问题?在两个人分别输入"a"和"b"的简单例子中,如果服务器首先接收"a",它将通过将第二个人的"b"事件转换为"通过一个空格"来强制执行"ab"的输出. ,然后添加b"事件,反之亦然.

其次,如果排序无关紧要,是否存在技术原因导致Google Docs选择在删除方面犯错?或者用户的原因很简单?

ade*_*ago 5

这是(5 年后我知道)正在发生的事情的图形解释(这实际上是@osma 描述的但图形解释的):

当您在 GDocs 中加粗一个字符串时,您实际上是将字符串包装到一个容器中,大概是<strong></strong>但它们可能使用任何其他语法。为简单起见,我们只说加粗字符串只需要在单词的开头加一个“+”。这样文本“lorem ipsum”就会变成lorem +ipsum而不是lorem <something>ipsum<something>

1

Alice 和 Bob 的起始文本都是“Lorem ipsum” 在此处输入图片说明

2

然后鲍勃删除“ipsum”。请注意,他向服务器发送的是变更集retain(6), delete(5)。一个变更集本质上是一个补丁,它的结构很可能基于这个库在此处输入图片说明

3

Alice 将“ipsum”加粗(添加“+”)。请注意,她发送的是变更集retain(6), insert(+), retain(5) 在此处输入图片说明

4

两个变更集现在都传送到对这些变更集一无所知的服务器。 在此处输入图片说明

5

假设最坏的情况:Bob 的包裹首先到达,然后该词将被删除。(另一种情况很明显)。 在此处输入图片说明

6

当 Alice 的包裹到达时,它只会在文本中添加一个“+”,因为她发送的只是一个变更集在此处输入图片说明

7

两个文本都是向客户端广播的变更集。这是第一个。 在此处输入图片说明

8

这是第二个。 在此处输入图片说明

9

将这些变更集修补到原始文本中后,您最终会得到“Lorem +”。这个符号稍后会被一个常见的 HTML 清理过程删除,该过程消除了具有以下格式的任何标签<tag></tag>

在此处输入图片说明

要测试此演示,请访问:http : //operational-transformation.github.io/visualization.html。在那里您可以处理发送/接收的文本和包裹。

  • 模拟非常有帮助。 (2认同)

ehf*_*eng 1

这不是删除方面犯错的问题。

如果两个客户端都具有平等有效但事实版本不同的情况,Google 文档必须选择支持一个版本,否则会强制用户解决冲突,这本质上是复杂且难以解释的。

因此,Google 文档的“真相”是文档的一致性,而不是意图的辨别。通过破坏信息(一种熵的趋势)可以更容易地实现一致性。

不过,这一切基本上都是我的半哲学废话……