钉钉文档协同编辑背后的核心技术原理

网络
有人说,互联网给人类社会带来最深层次的变革是改变了人与人协作的方式,将信息传播的成本大幅降低。身在互联网行业之中,研究信息传播的方式方法,是我们的日常功课。

有人说,互联网给人类社会带来最深层次的变革是改变了人与人协作的方式,将信息传播的成本大幅降低。身在互联网行业之中,研究信息传播的方式方法,是我们的日常功课。
信息传播的方式,按照时序效果,可分为同步和异步两类。

信息的同步传播

信息被生产的同时被消费。

话出我之口,入你之耳,过了此时此刻,想还原此情此景,麻烦得很,大多时候也不需要。同步场景下,信息的生产往往不需要深思熟虑,而是通过你来我往的讨论,澄清,逐步勾勒出话题的全貌。表达的时效性较之方式的丰富性更为重要。典型的场景如即时通讯,语音通话,视频会议等。简单明了,没有太多的格式。

信息的异步传播

信息的生产和消费异步发生。

典型的场景如论坛,博客,文档库,邮件。我在写这篇文档的时候,你们看不到。你们看的时候,我早已写完。异步场景下,信息的生产者会谨慎的推敲措辞,以确保自己的意思被准确的传达。表达方式的丰富性很重要,除了文本以外,段落结构,列表,示意图,表格都有利于信息的准确表达。

文档的信息表达方式

传统文档的信息表达方式是典型的异步传播。上述的几类异步场景都可见文档的影子。
然而2016年3月,Google上线的Google Docs颠覆了这个结论,这个改变世界的功能就是“多人实时编辑”,或者称作“协同编辑”。引入了协同编辑的在线文档,就像一块儿在线的白板,使得身处世界两端的人可以在上面共同迭代一个内容,通过你来我往的信息反馈,实现信息的同步传播。而编辑的结果又将沉淀下来,成为信息异步传播的载体。

兼具信息同步与异步传播的能力,协同文档的诞生,无疑给基于互联网的沟通协作带来了一场革命。
这场革命爆发于2006年,而它的起源,早在17年前。

1989年,代表着“文档”的Microsoft Office第一次在Macintosh系统上与世人见面,而代表着“协同”的操作变换算法也第一次见诸论文。
Microsoft Office 中所周知,而操作变换算法又是什么呢?

数据一致性问题与操作变换算法

对协同编辑最简单的理解类似于群聊天,每个人在自己的电脑上修改文档,把操作群发给其他打开这篇文档的用户。当收到来自其他用户的操作时,重放这个操作。比如下面这个例子:

但美好的设想,难免遭遇现实的挑战。因为网络存在延迟,来自不同用户的操作有可能在各端有不同的执行顺序。相同的操作,不同的执行顺序,会产生不同的结果。比如:

数据一致性是协同编辑的最低要求。当然,我们可以强制操作按照到达服务器的时间来排序,但这种排序会破坏用户编辑当时的上下文,产生不符合用户预期的编辑效果。
操作变换算法就在这里被引入了。

操作变换算法不是一个算法,而是对一类算法的统称。它们针对不同的文档数据模型,解决一个相同的问题:
基于同一个状态的两个操作,如何调整一个操作的参数,使得它可以在另一个操作之后执行,表达同样的用户意图。
上面的例子加上了操作变换,就可以解决数据一致性的问题,如下图所示:

当然,协同文档和操作变换算法的水还是很深的。本文只是对基本原理做个简单的介绍。想要了解更多,可以参考以下文献:

Operational Transformation Frequently Asked Questions and Answers
南洋理工大学教授Chengzheng Sun的Survey,覆盖了OT领域绝大多数研究成果

Google Wave Operational Transformation
G-Suite协同引擎的协议白皮书

Achieving convergence,causality-preservation, and intention-preservation in real-time cooperative editing systems
GOT算法及一维数据操作变换算法论文

Context-based Operational Transformation in Distributed Collaborative Editing Systems
COT算法论文

结语

2006年3月,Google Docs上线,多人实时协同编辑的功能惊艳世界,让稳坐办公套件头把交椅的 Microsoft Office 也感到虎躯一震。Office奋起直追,但同等功能的 Office 365 上线已是五年之后。协同编辑究竟是怎样的一座坚城,让兵强马壮的微软止步了五年之久?做一款协同编辑器需要哪些核心技术?协同编辑技术对于普通的前端应用开发会有怎样的启发? 在 D2 ,与大家分享更多技术原理与实践。

责任编辑:梁菲 来源: 阿里云开发者社区
相关推荐

2016-09-06 18:20:43

存储

2020-02-17 15:17:57

钉钉

2021-05-29 14:14:16

阿里云钉钉低代码开发

2020-06-10 14:01:46

阿里云钉钉Windows

2013-07-30 12:29:19

Google App Google技术Engine

2018-08-10 12:56:00

大数据

2023-08-22 20:48:06

模型钉钉阿里云

2018-03-21 11:05:26

Spark大数据应用程序

2017-05-14 14:41:20

5G波束基站

2022-12-06 08:00:16

awscli工具监控

2011-04-15 17:43:15

Google App Google

2022-05-11 12:52:25

框架实践应用

2017-03-01 18:19:33

钉钉

2018-08-07 11:51:27

钉钉

2018-07-16 12:22:42

白熊视频

2018-04-18 07:20:12

微信腾讯阿里巴巴

2018-07-03 15:03:50

2022-06-05 14:57:35

发送钉钉运维架构
点赞
收藏

51CTO技术栈公众号