ehf*_*eng 5 real-time google-docs google-wave operational-transform google-drive-api
今天尝试了这个实验:为Google文档打开了两个离线编辑器.在其中一个,我加粗了第一个字.在第二个,我删除了它.无论我先打开哪个客户端,该字总是会被删除.
首先,为什么会这样 - 我对运营转型的理解是订购问题?在两个人分别输入"a"和"b"的简单例子中,如果服务器首先接收"a",它将通过将第二个人的"b"事件转换为"通过一个空格"来强制执行"ab"的输出. ,然后添加b"事件,反之亦然.
其次,如果排序无关紧要,是否存在技术原因导致Google Docs选择在删除方面犯错?或者用户的原因很简单?
这是(5 年后我知道)正在发生的事情的图形解释(这实际上是@osma 描述的但图形解释的):
当您在 GDocs 中加粗一个字符串时,您实际上是将字符串包装到一个容器中,大概是<strong></strong>但它们可能使用任何其他语法。为简单起见,我们只说加粗字符串只需要在单词的开头加一个“+”。这样文本“lorem ipsum”就会变成lorem +ipsum而不是lorem <something>ipsum<something>
Alice 和 Bob 的起始文本都是“Lorem ipsum”

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

Alice 将“ipsum”加粗(添加“+”)。请注意,她发送的是变更集retain(6), insert(+), retain(5)

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

当 Alice 的包裹到达时,它只会在文本中添加一个“+”,因为她发送的只是一个变更集。

将这些变更集修补到原始文本中后,您最终会得到“Lorem +”。这个符号稍后会被一个常见的 HTML 清理过程删除,该过程消除了具有以下格式的任何标签<tag></tag>,
要测试此演示,请访问:http : //operational-transformation.github.io/visualization.html。在那里您可以处理发送/接收的文本和包裹。
这不是删除方面犯错的问题。
如果两个客户端都具有平等有效但事实版本不同的情况,Google 文档必须选择支持一个版本,否则会强制用户解决冲突,这本质上是复杂且难以解释的。
因此,Google 文档的“真相”是文档的一致性,而不是意图的辨别。通过破坏信息(一种熵的趋势)可以更容易地实现一致性。
不过,这一切基本上都是我的半哲学废话……
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |