数据结构与算法:CRDT

关联话题: Conflict-free Replicated Data Type、CRDTs

CRDT: Text Buffer

协同编辑文本的算法基于CRDT技术,通过为每个字符分配唯一标识符(包括创建者ID和序列号)来管理编辑操作。插入字符时,其父指针指向插入点前一个字符,字符顺序通过前序遍历树确定。删除字符时,将其标识符加入删除集,保留位置信息以便后续操作。该算法通过内存块合并、连续数组存储和范围删除优化,提升效率。

CRDT: Mutable Tree Hierarchy

在树结构中,每个节点通过父指针进行重定向,但简单同步最新指针可能导致循环。为防止循环,节点需记录所有历史父节点,并通过计数器标识最新关系。算法通过优先选择最新且不形成循环的父指针,确保所有节点最终形成一致的树结构。重定向时,还需更新路径中所有相关节点的计数器,避免意外改变多个节点的父指针。这种方法保证了树的稳定性和一致性。

CRDT: Tree-Based Indexing

本文介绍了一种用于点对点应用中对象顺序同步的算法,适用于文本编辑等场景。算法通过为每个对象设置父指针,确保并发插入的对象序列不会交叉。插入时,新对象的父指针指向插入点前的对象,并通过树的先序遍历确定顺序。该算法简单易实现,适合对象邻接性要求高的场景,但频繁重排序会导致数据膨胀,且不适用于大规模对象或逆序插入的情况。

Figma 在协同编辑中使用的顺序一致性算法: Fractional indexing

Figma采用Fractional Indexing算法保证多人协同操作顺序一致性。图形对象用0到1之间的64位浮点数表示索引位置,插入新节点时取中点值,避免覆盖其他用户操作。虽存在精度和冲突问题,但通过字符串表示法和随机偏移值有效缓解。该算法简单高效,适用于图形编辑器协同场景。

CRDT: Fractional Indexing

该算法适用于点对点应用中保持一致对象顺序的需求,如照片相册同步。通过为每个对象分配0到1之间的分数位置,并按位置排序确定顺序。插入对象时,在其前后对象位置间生成新分数,并添加随机偏移以避免冲突。算法简单易实现,无需保留旧位置信息,但可能在某些极端情况下导致索引过长或位置冲突,不适合处理文本等对邻接性要求高的场景。

A comparison of JavaScript CRDTs

Y.js、Automerge和JSON Joy是三个CRDT库,可以帮助我们理解什么是CRDTs以及如何实现LWW注册表。根据Bartosz Sypytkowski的介绍,CRDTs是一种直观的数据结构,他的实际示例很有帮助。对于理解CRDTs,Jacky的笔记也很有用。总结来说,Y.js易于集成,Automerge具有冲突处理功能,而JSON Joy提供了自定义协议的可能性。根据作者的描述,这些库都很不错,但没有实现作者期望的高级API。

基于CRDT的协同编辑开发(Yjs)

随着云上办公和远程工作的普及,越来越多的在线办公软件加入了协同编辑功能,使得多人能够同时编辑同一份资源,提高工作效率。

对于多人协作,开发人员通常使用 git 作为版本管理工具来并行开发需求,通过 merge 指令将各自的修改合并。然而,当多个人同时更改同一处内容时,可能会产生冲突,需要开发人员手动解决。

这种模式对一般用户并不友好。以前,大多采用悲观锁的方式,即一个文档只允许一个用户编辑,其他用户处于锁定状态,以避免协同编辑冲突。然而,悲观锁方式简单粗暴,效率较低。我们希望多人能够同时编辑同一份文档,且在出现冲突时能够自动解决,无需像 git 那样手动处理,确保文档一致性,降低用户心智负担。这就需要应用复杂的协同处理算法。

An Interactive Intro to CRDTs

CRDTs don't have to be all academic papers and math jargon. Learn what CRDTs are and how they work through interactive visualizations and code samples.

浅谈文档的实时协同编辑

本文针对生活中常见的协同编辑场景,介绍了几种业内常见的解决方案及其原理,适合对协同编辑算法零基础的同学进行科普性的学习。

浅谈在线文档的那些事儿

对前端来说开发一个在线文档需要啥技术呢?想一下,开发一个在线文档我们可能要解决的问题:

  • 最基础的文本编辑功能(哦?好像textarea就可以完成,那如果是富文本呢?)我们需要一个文档模型来描述文档;
  • 富文本编辑器,提供富文本的编辑和渲染能力;
  • 协同功能,不同的用户对同一份文档的编辑需要保持大家看到的都是一样的;
  • 协同网络模型,保证服务器和客户端之间的文档模型一致;

Yjs——一个基于CRDT的数据协同框架

目前,解决分布式数据一致性问题有两大主流的方案:OT与CRDT。OT算法由于提出时间早,方案成熟,被各大在线编辑产品使用。但因为需要定义与业务强相关的Operation,通过操作转换实现冲突处理,在应用上存在一定的限制。本文介绍一个新的基于CRDT的开源数据协同框架。

多人协同编辑技术的演进

多人协同编辑一直是我们 PingCode Wiki 不太敢触碰的一个功能,因为技术实现上有挑战。但协同编辑技术本身已经发展多年,解决方案已经相对成熟,我们团队也是在刚刚结束的 Q3 里完成了基于 PingCode Wiki 编辑器协同编辑的方案落地,所以这里想结合我们的技术选型及落地实践经验谈谈我对这块技术的理解。

主要内容以协同编辑技术为主,中间也会谈谈对技术发展演进的理解。

文本文档的协同编辑实现

atom 编辑器新增一个 teletype 的功能,可以实现多人在线编辑代码。效果看起来挺炫酷,想了解一下是怎么实现的,于是研究了一下。

抽象一下文本文档的协同编辑这个问题,就是同步多个设备之间的操作合并,最后都能达到最终一致的结果。现在解决文本文档的协同编辑有两种方案,一种是 Google Doc 使用的 Operational transformation (OT),还有一种就是 Atom teletype 使用的 Conflict-free replicated data type (CRDT)。

协同编辑冲突处理算法综述

本文将对协同编辑冲突处理算法的基本概念进行介绍,并对三种主流算法:OT、CRDT、AST,从理论层面分别对基本原理进行简单介绍,帮助从宏观角度更好地理解协同编辑冲突处理算法。

  • «
  • 1
  • »

Home - Wiki
Copyright © 2011-2025 iteam. Current version is 2.146.0. UTC+08:00, 2025-10-02 14:36
浙ICP备14020137号-1 $Map of visitor$