实时协作编辑 – 它是如何工作的?

我正在编写一个应用程序,我希望能够近乎实时地协作编辑文档(非常类似于Google文档样式编辑)。

我知道如何跟踪光标位置,这很简单。 只需使用当前用户标识,文件名,行号和可以存储在数据库中的行号轮询服务器半秒或秒,并且该轮询请求的返回值是其他用户的光标的位置。

我不知道如何做的是更新文件,这样不会抛开光标,强制完全重新加载,因为这对于我的目的来说会很慢。

这真的只能在谷歌浏览器,最好是Firefox的工作。 我不需要支持任何其他浏览器。

用于合并来自多个对等体的协作编辑的幕后algorithm被称为操作转换 。 虽然这不是微不足道的。

请参阅此问题以获取有用的链接。

你不需要xmpp或wave就可以了。 jinfinote( https://github.com/sveith/jinfinote )已经完成了一个名为infinote的开源实现的大部分工作。 Jinfinote最近也被移植到python( https://github.com/phrearch/py-infinote )来集中处理并发和文档状态。 我目前使用hwios项目( https://github.com/phrearch/hwios ),这依赖于websockets和json传输。 你不想真的想使用轮询这些types的应用程序。 此外xmpp似乎使事情复杂化不必要的imo。

实时协作编辑需要几件事情才能有效。 这里的其他大部分答案都只关注问题的一个方面。 即分布式状态(aka shared-mutable-state)。 操作转换(OT),无冲突复制数据types(CRDT),差分同步以及其他相关技术都是实现近实时分布式状态的方法。 大多数关注最终一致性,这允许每个参与者暂时的分歧状态,但是保证每个参与者状态最终会在编辑停止时收敛。 其他答案已经提到了这些技术的几个实现。

但是,一旦共享可变状态,您需要其他几个function来提供合理的用户体验。 这些附加概念的例子包括:

  • 身份 :你与谁合作的人是谁。
  • 存在 :现在谁在“现在”与您一起编辑。
  • 沟通 :聊天,audio,video等,允许用户协调行动
  • 协作提示:指示其他参与者正在做什么和/或将要做什么的特征。

共享游标和select是协作提示(又名协作感知)的例子。 他们帮助用户理解其他参与者的意图和可能的下一个行动。 原始的海报部分地询问了共享可变状态和协作提示之间的相互作用。 这很重要,因为文档中光标或select的位置通常是通过文档中的位置来描述的。 问题是游标的位置(例如)取决于文档的上下文。 当我说我的光标在索引37,这意味着我正在看的文档中的字符37。 您现在可能拥有的文档可能与我的文档不同,这是由于您的编辑或其他用户的编辑,因此您的文档中的索引37可能不正确。

所以你用来分配游标位置的机制必须以某种方式集成到或者至less知道系统的机制,它提供了共享可变状态的并发控制。 今天的挑战之一是,虽然有很多OT / CRDT,双向消息传递,聊天和其他库,但它们是没有集成的孤立的解决scheme。 这使得构build提供良好用户体验的最终用户系统变得困难,并且经常导致开发者想要解决的技术挑战。

最终,要实现一个有效的实时协作编辑系统,您需要考虑所有这些方面; 而且我们甚至没有讨论过历史,授权,应用级别冲突解决scheme等诸多方面。 您必须以适合您的用例的方式构build或查找支持这些概念的技术。 那么你必须整合它们。

好消息是,支持协作编辑的应用程序正变得越来越stream行。 支持构build它们的技术正在逐步成熟,每个月都有新的技术可用。 Firebase是第一个试图将许多这些概念包装成易于使用的API的解决scheme之一。 新一代的融合 (完全公开,我是Convergence Labs的创始人)提供了一个全function的API,支持大多数这些协作编辑方面,并且可以显着减less构build实时的时间,成本和复杂性协作编辑应用程序

在提出这个问题并进行更仔细的search之后,我认为最好的独立应用程序是Etherpad ,它作为JS浏览器应用程序运行,并在服务器端使用Node.js。 这背后的技术被称为运营转型 。

Etherpad最初是一个非常重量级的应用程序,被谷歌收购并纳入Google Wave,失败。 该代码是作为开源发布的,该技术在Etherpad Lite的Javascript中被重写,现在更名为“Etherpad”。 一些Etherpad技术可能也被整合到Google Docs中。

自Etherpad以来,这个技术已经有了各种版本,尤其是一些Javascript库,可以直接把它集成到你的networking应用程序中:

  • ShareJS
  • ot.js

我是meteor-sharejs软件包的维护者,可以将实时编辑器直接添加到meteor应用程序,恕我直言,这是两全其美的:)

正如Gintautas所指出的那样,这是通过运营转型来完成的。 据我了解,这项function的研究和开发的大部分是作为现已解散的Google Wave项目的一部分完成的,被称​​为Wave协议。 幸运的是,Google Wave是开源的,所以你可以在http://code.google.com/p/wave-protocol/上find一些好的代码示例。;

Google Docs小组围绕实时协作如何工作做了一些案例研究,但找不到博客条目。

维基百科页面上有一些体面的东西,但: http : //en.wikipedia.org/wiki/Collaborative_real-time_editor

我最近发布了一个存储库,其中包含一个您正在尝试实现的示例:

https://quill-sharedb-cursors.herokuapp.com

它基于ShareDB (OT)作为后端和前端的Quill富文本编辑器。

基本上只是用所有这些东西与更多的代码来绘制游标 。 代码应该是相当简单的理解,并复制到任何特定的解决scheme。

希望这有助于努力。