,大家好,我是前端西瓜哥,今天我们来聊聊 OT 算法是什么。,OT 的英文全称是 Operational transformation,是一种处理协同编辑的算法。,它常用于实现协同文档的底层算法,支持多个用户同时编辑文档,不会因为并发修改导致冲突,而使结果不一致或数据丢失。,假设 A 和 B 在同时编辑同一个内容,我们处理冲突的方式有:,对于在线协同文档。,加锁体验太差,一个人在编辑时其他人就要干等着。,覆盖则是导致用户的修改来回彼此覆盖,辛苦编辑的内容突然被别人覆盖掉了心情低落。,自行处理冲突则需要额外的操作步骤和成本,实时性很差,不适合高频同时修改的场景。,一致性算法是最好的选择,对用户最友好,不过带来了实现的复杂。,我们先来看看不使用 OT 导致的冲突问题。,假设用户 A 和用户 B 同时在编辑同一个文档,文档内容为 “12”。,结果是,用户 A 看到的内容是 “12BA”,用户 B 看到的内容是 “12AB”,内容不一致,不符合预期。,
,OT 算法可以解决一致性问题,我们来看看 OT 到底做了什么。,同样,原始内容是 “12”。,最后,用户 A 和用户 B 看到的是 一致 的 “12AB”。,
,这里的核心在于这个 transfrom 方法,它能够对操作进行修正。transform 没有固定实现,要根据实际需求自行实现。,这里有一个经典的菱形示意图。,
,从起始版本 T 开始,它接受了两个 并发操作 A 和 B。我们使用 trasform 方法生成 A' 和 B'。我们有:,这样,从 S 得到相同的 T,保证了一致性。,下面使用了 ot.js 库,演示了一下从 '12' 到 '12AB' 的过程。,线上 demo 链接为:,https://codesandbox.io/s/b8ds8h。,transform 操作既发生在服务端:将基于某个版本的并发操作对象转换成串行操作。,也发生在客户端,本地的修改还没来得及提交,就收到了服务端推送。,如果你想要深入研究 OT 算法,可以考虑参考 ot.js 库的代码实现,里面还附带了一个 OT 可视化过程。,https://github.com/Operational-Transformation/ot.js/。,OT 算法能够在实时保证多个客户端数据的一致性,被广泛用于协同编辑场景。
© 版权声明
文章版权归作者所有,未经允许请勿转载。