案例库 · 研发与科研 · 技术决策 · 2011-2018
CRDT让副本各奔东西仍能收敛,无需加锁
无冲突复制数据类型让并发编辑可交换,离线副本安全合并——Figma风格多人协作的基础。
INRIA · 剑桥大学
那一手
多用户编辑面临一个根本问题:当两个人离线或在不同连接上编辑同一个文档时,两个副本都变了,必须有人来协调。传统做法要么锁定部分文档——阻碍协作,要么使用操作转换,其状态组合爆炸,而且正确性证明出了名的难。
2011年,Marc Shapiro和同事提出了无冲突复制数据类型(CRDT):一种数据结构,让并发更新可以交换。如果每个更新都可交换,合并操作满足结合律,那么分叉的副本可以任意顺序合并,最终收敛到同一个状态,无需中心协调器,也没有冲突对话框。寄存器、计数器、集合和文本编辑器都能这样构建。
接下来的几年里,理论逐步成熟:2018年Martin Kleppmann等人的OpSets论文搭建了一个可执行框架,能机械验证复制数据类型算法,揭示了一个协作文本的正确性属性,而几个已发表的算法违反了它,并且定义了一个原子移动操作,之前被认为不加锁不可能实现。
生产系统采纳了这个想法。Figma的多人引擎明确受CRDT研究启发:其服务端授权、按属性设计就像一个最后写入者胜出的寄存器,在公司拒绝操作转换(认为过于复杂)之后选择。Redis、Riak和Cosmos DB都提供基于CRDT的数据类型,Apple的备忘录用CRDT在设备间同步离线编辑。
为什么管用
- 可交换的合并使得结果与更新顺序无关
- 副本可以离线编辑,无需中心权威即可收敛
- 机械验证取代了草率的手工正确性证明
- Figma这类产品在不引入OT复杂性的前提下实现了实时协作
可以搬走什么
如果协调是瓶颈,那就重新设计数据,让协调变得不必要:选择结果顺序无关的操作,并发用户就能免费获得一致性。
后来呢
CRDT现在是离线优先协作和复制的事实标准:Figma的多人同步、Apple备忘录、Redis和Riak的数据类型、点对点编辑工具都建立在它之上。研究继续聚焦文本编辑、树移动和拜占庭设置等难点。
资料来源
- OpSets: Sequential Specifications for Replicated Datatypes
- How Figma's multiplayer technology works
- Conflict-free replicated data type
发现哪里写错了?告诉我们。