本文范围
实时协同编辑让多个站点维护同一共享文档的副本,并允许用户在本地副本上产生编辑。本文将插入、删除等编辑请求称为用户操作,将字符、段落等被操作的文档内容称为文档元素;在内部数据结构中被标识和排序的文档元素统称为操作对象。网络异步传播时,不同站点可能基于不同文档状态产生并发操作。
本文按处理并发操作的基本机制归类操作转换(OT)、地址空间转换(AST)和可交换的复制式数据类型(CRDT)。操作、文档状态、因果关系、并发关系、全序和一致性目标的定义见实时协作算法相关概念。
协同编辑中的处理约束
若站点在每次编辑前等待锁授权,或等待所有相关操作被串行处理,本地编辑是否可以立即生效将取决于授权和消息往返。实时协同编辑通常允许站点先在本地副本产生操作,再异步处理远程操作,因此需要定义远程操作到达当前文档状态后的处理方式,以及同一批操作处理完成后的副本一致性条件。
这类机制不能只由排序决定。全序可以用于排序、重放或选择处理顺序,但插入、删除等用户操作如何在该顺序中解释,仍由算法的操作语义和并发处理规则规定。
操作转换(OT)
OT(Operational Transformation)以用户操作为处理单位。本地产生操作后,系统可先在本地副本执行;接收到远程操作时,系统将其与本地已执行的并发操作进行转换,再在当前文档状态上执行转换后的操作。转换的作用是根据已处理的并发操作调整待执行操作的参数。
转换函数的具体输入、位置计算和同位置并发时的规则依赖应用的操作语义。OT 实现通常需要维护与转换相关的操作历史或等价上下文,以判断待处理操作与哪些已执行操作并发。有关因果关系、全序和操作意图的边界见实时协作算法相关概念。
地址空间转换(AST)
AST(Address Space Transformation)也以用户操作和文档状态为处理对象。本文将其描述为:处理远程操作时,算法根据操作产生时的文档状态回溯文档地址空间,并在该地址空间中确定操作的执行位置,而非直接修改待执行操作。
因此,AST 与 OT 的区别在于并发处理的直接对象:OT 调整待执行操作的参数;AST 将位置解释放在操作产生时的地址空间中。两种方式的正确性都依赖具体的操作语义、状态记录和位置规则。仅依据 AST 的类别,不能推导其对任意操作都能保持意图。
可交换的复制式数据类型(CRDT)
CRDT(Commutative Replicated Data Type)将文档元素作为带唯一标识的操作对象处理。各站点维护对象 ID、顺序元数据及算法所需的内部状态,并依据这些信息处理并发更新,使副本在相关操作处理完成后收敛。
CRDT 不需要维护 OT 语境中的转换历史,并发操作也不通过 OT 转换函数处理。这个边界不表示 CRDT 不保存状态:对象 ID、顺序元数据和内部数据结构仍是其处理操作对象所需的信息。ID 的生成方式、顺序定义和删除处理均属于具体 CRDT 实现;是否保持某种操作意图也需要由这些语义和实现规则验证。
三类算法的机制区别
| 类型 | 主要处理单位 | 处理并发操作的机制 | 需要由具体实现定义的部分 |
|---|---|---|---|
| OT | 用户操作 | 将待执行操作与已执行的并发操作转换后执行 | 转换函数、操作历史或上下文、操作语义 |
| AST | 用户操作与文档地址空间 | 回溯到操作产生时的地址空间以确定执行位置 | 状态记录、地址空间表示、位置规则 |
| CRDT | 带唯一 ID 的操作对象 | 依据对象 ID、顺序元数据和内部数据结构处理并发更新 | ID 与顺序定义、删除处理、操作语义 |
三类方法描述的是并发处理路径,不替代一致性目标。因果一致性和结果一致性说明各站点处理操作时需要满足的顺序与收敛条件;操作意图则需要结合具体操作语义定义。相关定义和统一示例见实时协作算法相关概念。

