标签: collaborative-editing

Google文档如何处理编辑冲突?

我一直在编写自己的Javascript编辑器,其功能类似于Google Docs(允许多人同时处理它).有一点我不明白:

假设您已将用户A和用户B直接相互连接,网络延迟为10毫秒.我假设编辑器使用diff系统(据我理解Docs),其中编辑表示为"在索引3处插入'文本',并且差异被加时间戳并强制按时间顺序应用于所有客户端.

让我们从包含文本的文档开始:"xyz123"

用户A在时间戳001ms处在文档的开头键入"abc",而用户B在时间戳005ms处在"xyz"和"123"之间键入"hello".

两个用户都希望结果是:"abcxyzhello123",但考虑到网络延迟:

  • 用户B将在时间011ms接收用户A对"在索引0处插入'abc'的编辑.为了保持按时间顺序排列,用户B将在索引3处撤消用户B的插入,在索引0处插入用户A的"abc",然后在索引3处重新插入用户B的插入,该索引现在位于"abc"和"xyz之间" ,"因此给"abchelloxyz123"
  • 用户A将在时间015ms接收用户B对"在索引3处插入'hello'的编辑.它会认识到用户B的插入是在用户A之后完成的,只需在索引3处插入"hello"(现在在"abc"和"xyz"之间),给出"abchelloxyz123"

当然," abchello xyz123"与" abc xyz hello 123"不一样

除了字面上为每个角色分配自己的唯一ID之外,我无法想象Google将如何有效地解决这个问题.

我想到的一些可能性:

  • 跟踪插入点而不是使用差异发送索引将起作用,但如果用户B在编辑之前移动了1ms的插入点,则会遇到完全相同的问题.
  • 您可以让用户B使用他的差异发送一些信息,例如"在'xyz'之后插入'",这样用户A就可以智能地识别出这种情况,但是如果用户A插入文本"xyz?"该怎么办?
  • 用户B可以识别出这种情况发生了(当它收到用户A的差异并发现它是冲突时),然后发出一个diff撤消用户B的编辑和一个新的差异,它进一步插入用户B的"你好""abc".length索引对.这个问题是(1)用户A会在文本中看到"跳跃",(2)如果用户A继续编辑,则用户B必须不断修复其差异 - 即使"修复者"差异也会关闭并需要修复,指数增加复杂性.
  • 用户B可以发送一个属性,它接收到的最后一个时间戳差异是-005ms或者其他东西,然后A可以识别B不知道它的变化(因为A的差异在001ms)然后进行冲突解决.问题是(1)所有用户的时间戳都会稍微偏离,因为大多数计算机时钟都不准确到ms;(2)如果第三个用户C的用户A延迟25ms,但用户B滞后2ms,用户C在-003ms之间在"x"和"y"之间添加一些文本,然后用户B将用户C的编辑作为参考点,但是用户A不会知道用户C的编辑(以及用户B的参考点)直到22ms.我相信如果您使用通用服务器为所有编辑加时间戳,这可以解决,但这似乎相当复杂.
  • 你可以给每个角色一个唯一的ID,然后处理那些ID而不是索引,但这似乎有点过分......

我正在阅读http://www.waveprotocol.org/whitepapers/operational-transform,但很想听到解决这个问题的所有方法.

algorithm editing google-docs collaborative-editing operational-transform

21
推荐指数
1
解决办法
4636
查看次数

5
推荐指数
1
解决办法
1245
查看次数

替代退休的 TogetherJS

有什么可以替代TogetherJS的好方法吗?它的GitHub已经几个月没有任何活动了,这篇文章说它目前已经死了,未来不确定。

可以说,ShareJS 是 TogetherJS 最独特的功能,它能够查看他人的光标以用于故障排除/远程协助。

javascript websocket collaborative-editing togetherjs

5
推荐指数
1
解决办法
5228
查看次数

实现通用的实时协作编辑器/插件(如Google Docs)

所以,我正在考虑实现一个实时协作编辑器,因为一些预制的(例如etherpad)缺乏专用编辑器的功能.

我目前使用CKEditor,但我希望切换到Aloha Editor.

我将使用Pusher进行推送通知/更新到我的应用程序周围的地方,以便在多人使用该软件时,一切都可以尽可能实时.

现在,我最初关于如何实现协作编辑器的思考过程似乎非常缓慢 - 使用推送器不断更换整个文本字段...但是移动巨大的文本块会快速变得非常丑陋,我不太确定当有多个(> 5)人同时处理文本时该怎么办..所以......必须有一种更容易,更有网络效率的方式来进行协作编辑.

想法?

html javascript collaborative-editing

3
推荐指数
1
解决办法
1963
查看次数

Docker Nextcloud 无法加载 Collabora Online - 请稍后再试

我有这个错误消息:

无法加载 Collabora Online - 请稍后重试

当我尝试打开文件时,位于自托管 nextcloud 网站的右上角

欢迎来到 Nextcloud Hub.docx

在 Nextcloud 中,它作为 Docker 容器运行。

欢迎使用 Nextcloud Hub.docx位于“文件”>“文档”中,作为示例文件。

截屏

我使用的是nextcloud:19-apache的官方映像
,我是这样启动的:

#!/bin/sh

set -e;
set -f;

docker run -d \
--name nextcloud \
-p 8080:80 \
-v /tmp/nextcloud/var/www/html:/var/www/html \
-v /tmp/nextcloud/var/lib/mysql:/var/lib/mysql \
-v /tmp/nextcloud/var/lib/postgresql/data:/var/lib/postgresql/data \
nextcloud:19-apache

sleep 3;

firefox "http://localhost:8080"

exit 0;
Run Code Online (Sandbox Code Playgroud)

我这样检查日志:

docker logs nextcloud
Run Code Online (Sandbox Code Playgroud)

除了这一条目之外,没有任何错误/警告:

AH00558:apache2:无法可靠地确定服务器的完全限定域名(使用 172.17.0.2)。全局设置“ServerName”指令以抑制此消息

单击 nextcloud web 设置 > 应用程序显示 Collabora 所需的两个应用程序均已安装:

在此输入图像描述

然而,没有它们的状态是否正常运行。

所有正在运行的容器的状态:

NETWORK ID          NAME                DRIVER              SCOPE
88efc7e2489f …
Run Code Online (Sandbox Code Playgroud)

php document collaborative-editing docker nextcloud

3
推荐指数
1
解决办法
3100
查看次数