运营转型库?
Posted
技术标签:
【中文标题】运营转型库?【英文标题】:Operational Transformation library? 【发布时间】:2011-01-03 19:55:49 【问题描述】:我正在寻找一个允许我在多个用户之间实时同步文本的库(ala Google Docs)。
我偶然发现了运营转型,这似乎符合我的需求。话虽如此,我了解 OT 的主旨,但不了解 OT 的数学和实现。
因此,我想知道是否有一个拖放 javascript 库可以挂接到文本区域,生成转换,然后允许我将这些转换应用到另一个客户端?
(我已经获得了 Etherpad 的源代码,但我无法从中看出端倪。如果有人能指出如何利用 Etherpad 的 OT 实现,那就太好了!)
【问题讨论】:
由 Firebase 提供支持的名为 Firepad 的协作文本编辑器 - firepad.io 检查代码以获得一些灵感 github.com/FirebaseExtended/firepad 【参考方案1】:我认为 Google Wave 的 OT 实施的部分内容是开源的(而且还会有更多部分)。
我不确定这是否是您正在寻找的,但 OT 的替代品是 Differential Synchronization:
Google-Diff-Match-Patch - Diff, Match and Patch libraries for Plain Text:“Diff Match 和 Patch 库提供了强大的算法来执行同步纯文本所需的操作。” Google-MobWrite - Real-time Synchronization and Collaboration Service:“MobWrite 将表单和 Web 应用程序转换为协作环境。创建一个简单的单用户系统,添加一行 JavaScript,立即得到一个协作系统。”(使用 Google-Diff-匹配补丁。)【讨论】:
Diff-Match-Patch 结合 Neil Frasier (neil.fraser.name/writing/sync) 的差分同步论文成功了!非常感谢您为我指明了正确的方向。 据我了解,Diff-Match-Patch 以及扩展,MobWrite(因为后者使用前者)仅支持文本,而不支持二进制更改。但是,有一个与 html 表单元素协作的演示,这表明它不仅支持纯文本。 自从这个答案以来,“还有更多的部分即将到来”有什么好消息吗? 实际上,Google-Diff-Match-Patch 旨在实现 Operational Transformations 的替代方法,即差分同步,了解差异可以阅读 DS 的 Neil Fraser 文档:neil.fraser.name/writing/sync (OT 在本文档中被称为事件传递)。它们是两种截然不同的方法。 这是旧的,但如果你介意,我已经开源了 github.com/benjamine/JsonDiffPatch 它使用 Neil 的 Diff-Match-Patch 处理长字符串,但它适用于任意 js 对象图【参考方案2】:一位前 Wave 工程师发布了一个名为 ShareJS 的协作编辑算法的 Coffeescript 实现,现在命名为 ShareDB。
【讨论】:
ShareJS 可能比 MobWrite 对 Google 的 Diff 和 Patch 所做的更简单、更好地记录和更可重用。【参考方案3】:我会总结一下我找到的解决方案。
运营转型:例如
Google Wave OT。该方法基于所谓的 Jupiter 方法。 ShareJs。基于与 Google Wave OT 相同的 OT 算法。 Coweb-jsoe。基于 COT - 一种非常复杂的 OT 方法,还支持 p2p 消息传播。 OpenCoweb。它利用 OpenCoweb-jsoe 为许多类似问题提供一个成熟的框架。 OT.js 基于 ShareJs 的操作类型。 DriveSDK。一个非常有趣的 API,可以做很多事情——例如图表协作。 SwellRT 是 Apache Wave 的一个分支。是联合的,并且支持富文本。差分同步:
Neil Fraser 的 Diff-Match-Patch。 MobWrite 利用 Diff-Match-Patch 算法。CRDT(可交换复制数据类型):
有许多不同的 CRDT 算法允许实现共享类型。一些 CRDT 使用 P2P 消息传播,一些依赖于客户端-服务器模型 Yjs 允许您共享任意数据类型(RichText、Array、Hash Maps、.. 可扩展)。离线支持和支持 P2P 通信协议(有 XMPP、Websockets 和 WebRTC 模块) SwarmJS 具有离线支持的客户端服务器共享数据库。与 React 配合得很好 Woot Woot CRDT 的实现 CRDT 另一个 CRDT 实现 Automerge【讨论】:
Google Drive API 使用 OT 而不是 DS。 developers.google.com/drive/realtime/conflict-resolution【参考方案4】:OT 库:
https://github.com/sveith/jinfinote https://github.com/jvanveen/py-infinote在 HWios websocket 项目中,我成功地使用了两者的组合(服务器端的 py-infinote,客户端的 jinfinote)来同步文档状态。
【讨论】:
【参考方案5】:ot.js 库https://github.com/Operational-Transformation/ot.js 可能对多用户场景有用。
【讨论】:
【参考方案6】:https://github.com/opencoweb/coweb
【讨论】:
【参考方案7】:由于可靠地同步共享可变状态的复杂性,该问题的交钥匙或“拖放”解决方案实际上并不存在。 dmonad 的回复是一个不错的综述,我发布了关于可用解决方案here 的更新概述。
这个问题已经很老了,但Convergence(免责声明:我是创始人)提供了最全面的解决方案,不仅提供数据同步,还提供许多其他 API,可用于构建协作 UX。 Here is an example 准确显示您的要求:跨多个客户端同步文本字段。
否则,ShareDB 是一个很好的开源解决方案,可以满足很多人的需求。
【讨论】:
【参考方案8】:还可以查看这些 Javascript 库:
https://github.com/vitotafuni/JSOTTEST https://github.com/fitzgen/operational-transformation-example【讨论】:
【参考方案9】:Npm 为 node.js 提供了一些不错的 ot 库:
https://npmjs.org/package/ot -- 内置的 codemirror 和 ace 适配器以及客户端和服务器实现 https://npmjs.org/package/changesets -- 可以在节点和浏览器中使用的普通 ot 库;允许您构建可以发送、相互转换并应用于文档的“变更集”(本质上是差异)【讨论】:
【参考方案10】:我编写了一个小型 unixy(做一件事并做好)库,它实现了 OT 控制层,允许您插入不同的 OT 类型(支持所有 shareJS 兼容类型)。 它类似于 shareJS,但不那么固执己见,更抽象。
https://github.com/marcelklehr/gulf
【讨论】:
【参考方案11】:您可以通过Cedanet 与这些人交谈。尽管 Ceda 是封闭源代码,并且他们的网站上没有免费试用版。我一直参与 Ceda 的开发,并继续在商业项目中使用它,所以如果你走这条路,我也许可以提供一些反馈/建议。
【讨论】:
【参考方案12】:使用 js 客户端库 (Strophe.js),您可以使用免费的 XMPP 服务器(如 jabber.org)和我的客户端 OT 库 (JSOTTEST) 来构建完整的客户端-服务器系统。
有时间修改代码,我会提交一个演示客户端-服务器聊天系统的src。
【讨论】:
大约两年前,您写“我将提交一个演示的 src...”。你完成那个演示了吗? 对不起...但我没有时间发布公开演示!然而,使用 Bosh lib for php 非常简单!再见【参考方案13】:我们正在构建一个将操作转换与版本控制相结合的协作编辑器。这样我们就可以同时支持离线和在线协作。我们昨天发布了自己的 OT 库,作为我们开源堆栈的一部分。
http://interior.substance.io/modules/operator.html
我们还提供了一个用于版本控制的库。
http://interior.substance.io/modules/chronicle.html
【讨论】:
【参考方案14】:我认为带有 etherpad lite 的 etherpad.org 优于其他解决方案。
【讨论】:
你能用一些例子来证明 etherpad 的优越性吗?以上是关于运营转型库?的主要内容,如果未能解决你的问题,请参考以下文章
Nutanix Prism助力企业提高运营效率,加快企业数字化转型