【问题标题】:Operational Transformation library?运营转型库?
【发布时间】:2011-01-03 19:55:49
【问题描述】:

我正在寻找一个允许我在多个用户之间实时同步文本的库(ala Google Docs)。

我偶然发现了运营转型,这似乎符合我的需求。话虽如此,我了解 OT 的主旨,但不了解 OT 的数学和实现。

因此,我想知道是否有一个拖放 Javascript 库可以挂接到文本区域,生成转换,然后允许我将这些转换应用到另一个客户端?

(我已经获得了 Etherpad 的源代码,但我无法从中看出端倪。如果有人能指出如何利用 Etherpad 的 OT 实现,那就太好了!)

【问题讨论】:

标签: etherpad operational-transform


【解决方案1】:

我认为 Google Wave 的 OT 实施的部分内容是开源的(而且还会有更多部分)。

我不确定这是否是您正在寻找的,但 OT 的替代品是 Differential Synchronization

【讨论】:

  • 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

【讨论】:

【解决方案4】:

OT 库:

在 HWIOS websocket 项目中,我成功地使用了两者的组合(服务器端的 py-infinote,客户端的 jinfinote)来同步文档状态。

【讨论】:

    【解决方案5】:

    ot.js 库https://github.com/Operational-Transformation/ot.js 可能对多用户场景有用。

    【讨论】:

      【解决方案6】:
      【解决方案7】:

      由于可靠地同步共享可变状态的复杂性,该问题的交钥匙或“拖放”解决方案实际上并不存在。 dmonad 的回复是一个不错的综述,我发布了关于可用解决方案here 的更新概述。

      这个问题已经很老了,但Convergence(免责声明:我是创始人)提供了最全面的解决方案,不仅提供数据同步,还提供许多其他 API,可用于构建协作 UX。 Here is an example 准确显示您的要求:跨多个客户端同步文本字段。

      否则,ShareDB 是一个很好的开源解决方案,可以满足很多人的需求。

      【讨论】:

        【解决方案8】:
        【解决方案9】:

        Npm 为 node.js 提供了一些不错的 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 的优越性吗?
                猜你喜欢
                • 2011-07-05
                • 1970-01-01
                • 2015-03-01
                • 1970-01-01
                • 2017-04-06
                • 2017-02-12
                • 1970-01-01
                • 1970-01-01
                • 2021-10-12
                相关资源
                最近更新 更多