理解 OT 算法
1.关于 OT
假如 A 用户看到一段初始文本,内容是 “abc”,然后 A 想 第 3 个位置后面,插入”d” => “abcd”
假如 B 用户看到一段初始文本,内容是 “abc”, 然后 B 想在第 3 个位置后面插入”e” => “abce”
不做锁处理或者丢处理,那我们就保留最大内容(A,B 先后执行),应该是 “abcde”, 如何按实际执行结果来看:
如果各自操作,没有 OT 算法的处理,那么 A 看到的内容就会是 “abced”(A 在第 3 个位置后面,然后 B 想在第 3 个位置后面插入”e” => abce),对于 B 用户而言,他实际上得到了一个顺序执行,就是 B 想在第 3 个位置后面插入”e” => abce , 然后 A 想 第 3 个位置后面插入”d”,最后得到的就是 "abcde", B 的结果刚好复合,这个时候 B 是对的,A 就是错的,所以 A 最终看到的不应该是原始的 B 操作,而是转化后的,他应该得到 “B 想在第 4 个位置后插入 e”,因此,我们要引入一个 OT 算法,最终结果就是说:
文本内容 = A 内容 x B’ = A 内容 x follow(A,B) = merge(A,B) = B 内容 x A’ = B x follow(B,A)
Follow 函数 的第一个参数代表第一个执行的操作,第二个参数代表后执行的操作
Merge 代表合并后的最大可用集合
2.关于服务器设计
服务器中维护了一系列历史的修改版本,例如 r1,r2,r3,…r100,…r110
假如某个客户端提交的变化 C,是基于 R100 的,这时候,我们需要不停的产生变化 newC = follow(R101,C) , 然后 newC = follow(R102,newC),不断执行,最后要得到针对 r110 这个版本的 newC 变化,推送到各个客户端
ot.js 的核心实现
3. OT 算法可视化
http://operational-transformation.github.io/visualization.html
更多参考:
https://www3.ntu.edu.sg/home/czsun/projects/otfaq/
http://operational-transformation.github.io/ot-for-javascript.html
https://segmentfault.com/a/1190000019827632
http://operational-transformation.github.io/visualization.html
版权声明: 本文为 InfoQ 作者【张驰Terry】的原创文章。
原文链接:【http://xie.infoq.cn/article/065a5aea38ea4c9c613cea618】。文章转载请联系作者。
评论