一、OT
操作转换(OT)
广泛用于协作编辑中的冲突解决的技术,一种【无锁】、【非阻塞】的冲突解决方法。若协作者之间的操作冲突,OT会解析冲突并将正确的汇聚状态推给最终用户。因此,OT为用户提供一致性。
OT 使用位置索引方法执行操作来解析上面讨论的那些冲突。通过保持交换律、幂等性来解决上述问题。
基于 OT 的协作编辑器在满足以下两个属性时一致:
-
因果关系保持:如果操作 a 发生在操作 b 前,那先执行操作 a,然后执行操作 b
-
收敛:不同客户端上的所有文档副本最终相同
上述属性是 CC 一致性模型的一部分,CC 一致性模型是协作编辑中一致性维护的模型。
OT的缺点
对字符的每个操作都可能需要更改位置索引。这意味着操作之间存在顺序依赖关系。它的开发和实现具有挑战性。
OT是一组复杂算法,其正确实现在实际应用中已被证明有挑战性。Google Wave 团队花两年时间实现OT。
二、CRDT
无冲突复制数据类型 (CRDT)
是为了改进 OT。CRDT 具有:
-
复杂的数据结构
-
但简化的算法
CRDT 通过为每个字符分配两个关键属性来满足交换律和幂等性:
-
为每个字符赋予全局唯一标识
-
全局订购每个字符
每个操作现在都有一个更新后的数据结构:CRDT 简化的数据结构
SiteID 唯一标识请求操作的用户站点,带有一个值和一个 PositionalIndex。PositionalIndex值可以是分数:
-
某些操作不会改变其他字符的 PositionalIndex
-
避免不同用户操作之间的顺序依赖性
示例描绘来自站点 ID 123e4567-e89b-12d3 的用户在 PositionalIndex 为 1.5 的位置插入一个值为 A 的字符。尽管添加了新字符,但使用小数索引保留了现有字符的位置索引。因此,避免了操作之间的顺序依赖性。如下所示,在 O 和 T 之间插入()并没有影响 T 的位置。
防止操作之间的顺序依赖性:
CRDT 确保用户之间的强一致性。即使一些用户处于离线状态,当他们重新联机时,最终用户处的本地副本也将汇聚。
尽管众所周知的在线编辑平台如 Google 文档、Etherpad 和 Firepad 使用 OT,但 CRDT 使协作文档编辑中的并发和一致性变得容易。事实上,使用 CRDT,可以实现无服务器点对点协作文档编辑服务。
注意
OT 和 CRDT 是协作编辑中冲突解决的良好解决方案,但我们使用 WebSockets 可高亮协作者的光标。其他用户也能预期该协作者的下一个操作的位置,并自然和自觉地避免冲突。
三、基于CRDT实现的开源文档协作产品有哪些
这些项目的源代码都提供了丰富的文档和示例,可以帮助您了解如何使用CRDT来实现文档协作功能。您可以通过阅读这些项目的文档和示例来深入了解它们的工作原理和用法。
-
Yjs: Yjs 是一个流行的开源 CRDT 库,它提供了用于构建实时协作应用程序的工具和协议。Yjs 可以用于构建各种类型的协作应用,包括文档编辑、绘图、笔记和聊天等。Yjs 得到了广泛的应用,并且有许多与它集成的文档协作产品。
-
Automerge: Automerge 是另一个流行的开源 CRDT 库,它专注于实现分布式协作和同步的数据结构。Automerge 可以用于构建支持实时协作编辑的文档、表格和其他数据类型的应用程序。
-
ShareDB: ShareDB 是一个实时协作后端库,它基于 CRDT 实现了实时编辑功能。它可以与各种前端框架和库结合使用,用于构建实时协作的文档编辑和应用程序。
关于基于CRDT实现的开源文档协作产品的源码案例,您可以查看以下项目:
-
Yjs:Yjs 项目本身就是一个开源的实时协作库,其源代码托管在 GitHub 上。您可以在 GitHub - yjs/yjs: Shared data types for building collaborative software 找到 Yjs 的源代码,并且该仓库中也包含了一些示例和演示。
-
Automerge:Automerge 也是一个开源项目,其源代码同样托管在 GitHub 上。您可以在 GitHub - automerge/automerge: A JSON-like data structure (a CRDT) that can be modified concurrently by different users, and merged again automatically. 找到 Automerge 的源代码,并且该仓库中包含了详细的文档和示例。
-
ShareDB:ShareDB 是另一个开源的实时协作后端库,其源代码同样托管在 GitHub 上。您可以在 GitHub - share/sharedb: Realtime database backend based on Operational Transformation (OT) 找到 ShareDB 的源代码,并且该仓库中也包含了示例和用法说明。
-
一个符合您需求的开源项目是 Apache Wave。Wave 最初是由 Google 开发的实时协作平台,后来成为 Apache 基金会的一个孵化项目,并采用了 Apache 2.0 许可证。Wave 使用了 CRDT 技术来实现实时协作功能,包括文本编辑、评论、版本控制等。
您可以在 Apache Wave 的 GitHub 仓库中找到源代码和文档:https://github.com/apache/incubator-wave。
对比:
2024/3/29 18:32:00
当涉及到 Yjs、Automerge 和 ShareDB 这三种技术时,它们都提供了基于 CRDT 的实时协作功能,但在一些方面可能有所不同。以下是它们的一些比较:
-
Yjs:
- Yjs 提供了一个灵活而强大的实时协作框架,可以用于构建各种类型的协作应用程序。
- Yjs 提供了丰富的文档、示例和社区支持,使得学习和使用它相对容易。
- Yjs 支持多种数据类型的实时协作,包括文本、数组、地图等。
- Yjs 采用了一种称为 "微调整"(fine-tuning)的策略来处理并发编辑,以减少冲突的发生,并且提供了一些自定义策略的选项。
-
Automerge:
- Automerge 提供了一个简单且易于使用的 CRDT 库,专注于实现分布式协作和同步的数据结构。
- Automerge 的设计目标是提供类似于 Git 的数据模型,以便跟踪和管理复杂的编辑历史。
- Automerge 适用于构建支持实时协作编辑的文档、表格和其他数据类型的应用程序。
- Automerge 的实现相对轻量,并且在处理大量编辑时表现良好。
-
ShareDB:
- ShareDB 是一个实时协作后端库,可以与各种前端框架和库结合使用。
- ShareDB 提供了一种基于 JSON 文档的数据模型,可以用于构建实时协作编辑功能。
- ShareDB 具有良好的可扩展性和性能,并且在处理大规模协作编辑时表现良好。
- ShareDB 还提供了一些附加功能,如权限控制、版本控制等。
总体而言,这三种技术都提供了可靠的基于 CRDT 的实时协作功能,但它们在设计理念、功能特性和用法上有所差异。选择哪种技术取决于您的具体需求和偏好,以及项目的特点和规模。您可以根据自己的情况仔细评估和选择合适的技术。