在分布式协同编辑领域,无冲突复制数据类型(CRDT)早已成为解决并发编辑冲突的核心技术。从Google Docs到Figma,从Notion到VS Code Live Share,CRDT让多个用户同时编辑同一份文档、同一张画布或同一段代码成为可能,而无需担心数据丢失或状态不一致。然而,一个更深层的问题正在引发研究者的思考:CRDT能够优雅地处理并发编辑,却为何难以应对并发创建?当多个用户同时试图创建同一个资源——例如新建一个文件、注册一个用户名或分配一个唯一ID——现有CRDT方案往往束手无策。

并发编辑的成功密码

要理解这个问题的根源,首先需要明白CRDT为何能完美解决并发编辑。CRDT的核心思想是设计一种数据结构,使得不同副本上的操作(如插入字符、删除段落、移动图层)满足数学上的交换律、结合律和幂等性。这意味着无论操作到达的顺序如何,最终所有副本都能收敛到相同的状态。例如,在文本CRDT中,每个字符被赋予一个唯一且全局有序的“位置标识符”,两个用户同时插入字符时,系统可基于标识符的排序规则确定最终位置,而不会产生冲突。这种设计天然适应了“修改已有数据”的场景——因为它只需定义合理的合并函数,而不需要解决“谁先创建”的问题。

并发创建的三重困境

然而,当多个用户试图同时“创建”一个实体时,情况骤然复杂。以分布式系统中的“创建唯一资源”为例:假设两个用户同时尝试创建一个名为“project-alpha”的文件夹,或者两个客户端同时申请同一个用户名。这类操作本质上要求系统保证资源的唯一性原子性,而CRDT的最终一致性模型恰恰缺乏这种强约束。

第一重困境在于标识符的全局唯一性。编辑操作依赖现有数据(如字符位置)来构造标识符,而创建操作则需要凭空生成一个不会与其他人冲突的标识符。虽然CRDT常用Lamport时钟或UUID来保证标识符唯一,但这种方式只解决了“不冲突”,却没有解决“意图冲突”——用户A和用户B都认为“是我创建了这个项目”,而CRDT的合并结果可能同时保留两个同名资源,这不是用户期望的语义。

第二重困境在于所有权与业务逻辑。在协同编辑中,段落或字符的创建通常被视为无主操作,最终状态由合并规则决定。但在实际应用中,创建往往带有所有权属性——“谁创建了什么”不仅是一个数据结构问题,更是一个业务决策。例如,电商平台的两个管理员同时创建同一个商品ID,系统不能简单地合并为两个相同商品,而需要裁定其中一个有效。这种裁定需要外部共识机制,超出了CRDT自身的能力范围。

第三重困境是状态爆炸与不确定性。若允许并发创建相同的资源,CRDT的合并规则可能导致“分裂”——比如同时创建两个同名文件,再经过后续编辑,最终用户看到的可能是两个内容不同的文件,而这明显违背了创建的本意。更糟糕的是,如果创建操作涉及依赖关系(如创建新文件时需引用父目录),则并发创建可能导致循环依赖或引用悬空。

寻求平衡的探索之路

学术界和工业界并非没有意识到这个问题。一些研究者尝试将CRDT与共识算法(如Raft)结合,在创建环节引入强一致性。例如,在每次创建之前先通过Leader协商获取唯一令牌,但这样做会牺牲CRDT最宝贵的“去中心化”特性。另一些方案则提出“近似唯一性”,允许短暂冲突后在后台进行合并或重命名——Git的分支合并策略就是一个典型的例子:两个开发者同时创建同名分支时,Git会强制要求手动解决。还有团队设计出所谓的“CRDT-friendly”创建操作,例如使用永久唯一的随机ID作为资源标识,并在业务层提供冲突检测——但这种方式本质上是将矛盾转移给了应用开发者。

有趣的是,标题中“Why not concurrent creation?”本身可能就是一个隐喻:或许我们需要重新定义“创建”的含义。在纯粹的CRDT世界里,没有绝对的“存在”与“不存在”,只有“可见”与“不可见”。一些实验性的系统(如Automerge的“抽象数据结构”)尝试将任何资源的创建都视为一种特殊的“编辑”——即先创建一个“空占位符”,然后通过后续编辑操作填充内容。这样创建本身就不会产生冲突,因为它只是声称了一个标识符,真正的语义由后续的并发编辑决定。这个思路虽未完全成熟,却指出了一个新的方向:不是让CRDT去适应创建,而是让创建变成一种特殊的编辑。

未来:从“合并编辑”到“合并存在”

回到现实,当前主流的协同应用往往采用“混合策略”:在频繁编辑的场景(如文档内容、画布元素)中使用CRDT,而在需要唯一性的创建场景(如用户注册、文件新建)中引入中心化的原子操作或基于租约的锁。这种折中虽然可行,却在一定程度上削弱了CRDT的分布式优势。未来,随着去中心化应用(如本地优先软件、点对点协作平台)的兴起,对真正的“无冲突创建”的需求将日益迫切。也许答案不在于修改CRDT本身,而在于重构我们对“创建”的认知——当所有操作都被视为对已有数据的修改时,并发创建就不再是一个问题。

CRDT已然证明了“并发编辑”可以和谐共存,而“并发创建”的难题,或许正等待着下一个突破性的思维转变。正如分布式领域那句老话:没有银弹,但每一次思考都让我们离理想更近一步。