协同编辑功能实现原理概述

协同编辑是一种多用户同时在线编辑同一文档或项目的技术,允许多人实时或异步地对内容进行添加、删除和修改,但是不会互相覆盖各自的修改。这在文档编辑、软件开发等领域非常流行和有用,比如飞书文档、谷歌doc等。

协同编辑主要面临的技术问题包括:版本管理、冲突检测、合并冲突、实时同步、并发控制

协同编辑的主流算法主要包括:OT 算法(操作转换Operational Transformation)、CRDT 算法(冲突无关复制数据类型 Conflict-free Replicated Data Type)和DS 算法(差异同步算法Differential Synchronization )。

下面基于 OT 算法简单介绍一下协同编辑应用的实现原理。

一些概念

协同编辑,基于 socket 连接快速提交或者拉取数据。

用changeset 存储变更,多个变更应用在文档中就变成了新文档。

当A/B 两个变更都需要应用生效于文档中时,先应用的可以直接生效,后应用的需要基于先生效的变更做一些转换计算,得到一个可以直接应用于文档的A'或者B', XAB'或者XBA'就成了一个新文档。转换计算法的算法称之为follow算法。

对changeset集合进行 Compose 压缩整理,将changset数量减少,基于压缩后的changeset形成一个文档快照,减少文档被渲染时计算的次数

简单实现过程

客户端可以用三种类型的 changeset 来维护自身的状态,即 AXY

  • A:服务端最新版本,所有已提交到服务端到 changeset 的集合
  • X:所有客户端提交给服务器,但还未收到 ACK 的 changeset 的集合
  • Y:所有客户端产生了单还未提交给服务端到 changeset 的集合

客户端和服务端数据交互过程

  • 客户端将 X 和 A 版本提交到服务端后,使用 Y 来继续存储用户的变更,
  • 服务端使用 follow 算法处理产生冲突的 changeset 数据,并保存处理后的 changeset,向客户端发送 ACK,并告知处理成功后的 changeset 版本号,
  • 如果客户端有多个,服务端还需要向其他客户端广播这次提交的 changeset
  • 客户端将 AX 作为最新版本,Y 集合提交给服务端进行刚才一样的动作。

最简单的交互过程,单个客户端

多个客户端

posted @ 2024-03-17 18:11  Lucky小黄人^_^  阅读(49)  评论(0编辑  收藏  举报