初识协同编辑:OT和CRDT算法,文档协作的“魔法石”思考一下,如果想要实现一个富文本编辑器的的协同编辑,你能想到哪几种

思考一下,如果想要实现一个富文本编辑器的的协同编辑,你能想到哪几种方案呢?

这个是最最简单粗暴的办法:即保存最后一次修改,更早一些的其他人的修改直接被丢弃,也就是管其他人死活,我自己爽就好。

还可以利用锁机制去实现,比如:A用户正在编辑某个文档时,对此文档进行加锁处理,避免多人同时编辑,从而避免文档的内容冲突。优点:简单粗暴,但会影响用户体验。

第三种就是diff-patch了,我们可以类比基于git的版本管理,多人编辑时利用socket与服务端通信,当多人编辑时服务端进行差异对比、合并,自动进行冲突处理,在通过socket更新其他人本地的文档。弊端是会出现类似git修改同一行,纯靠服务端无法处理,需要手动处理的问题。

基于以上三种方法实现富文本编辑器的协同编辑时,无法实现真正意义的协同编辑。

于是就引出了OT和CRDT这类专门用于处理协同文档的方案,我们接下来主要是使用基于CRDT的Yjs方案实现一系列协同操作,不过也需要对OT做简单了解。

OT算法是一种用于实时协同编辑的算法,它通过操作转换来实现数据的一致性。在OT算法中,每个用户对数据的操作(如修改、删除等)都被记录下来,并在其他用户的客户端进行相应的转换,从而实现多个用户对同一份数据的协同编辑。

OT算法的优点在于它可以实时地反映用户的操作,并且可以很好地处理并发冲突。然而,OT算法需要在中心化的服务器上进行协同调度,因此对于大规模的分布式系统来说可能不太适用。

基于OT的协同编辑核心是:将文档的每一次修改看作是一个操作,即操作原子化处理,如在第N个位置插入一个字符时,客户端会将操作发送到服务端去处理。

客户端将原子化的操作发送到服务端时(必须有中央服务器进行调度),服务端对多个客户端的操作进行转换,对客户端操作中的并发冲突进行修正,确保当前操作同步到其他设备时得到一致的结果,因为对冲突的处理都是在服务端完成,所以客户端得到的结果一定是一致的,也就是说OT算法的结果保证强一致性。

转换完成后,通过网络发送到对应客户端,客户端合并操作,从而得到一致结果。

这也就意味着OT算法对网络要求更高,如果某个用户出现网络异常,导致一些操作缺失或延迟,那么服务端的转换就会出现问题。

下面是一个OT算法的协同过程:

上面这个演示体现了OT算法对网络要求更高的说法,Alice先修改的文档,由于网络的原因Bob的请求先到的服务器,但OT算法的期望是得到一致的结果,所以这一点看来也是没错的。

CRDT算法全称为Conflict-freeReplicatedDataType,即无冲突复制数据类型,是一种基于数据结构的无冲突复制数据类型算法,它通过数据结构的合并来实现数据的一致性。

在CRDT算法中,每个用户对数据的修改都会被记录下来,并在其他用户的客户端进行合并,以实现数据的一致性。CRDT算法的优点在于它可以适用于大规模的分布式系统,并且不需要中心化的服务器进行协同调度。但是,CRDT算法在处理复杂操作时可能会存在合并冲突的问题,需要设计复杂的合并函数来解决。

基于状态的CRDT更容易设计和实现,每个CRDT的整个状态最终都必须传输给其他每个副本,每个副本之间通过同步全量状态达到最终一致状态,这可能开销很大;

而基于操作的CRDT只传输更新操作,各副本之间通过同步操作来达到最终一致状态,通常很小。

下面是一个CRDT算法的协同过程:

向量时钟的基本思想是为系统中的每个节点维护一个向量,其中每个分量对应一个节点,用于记录该节点的事件发生次数。当一个节点发生事件时,它会增加自己分量的值。向量时钟的关键是在不同节点之间传递这些向量,并在合并时确保一致性。

两种方法的相似之处在于它们提供了最终的数据一致性。不同之处在于他们如何做到这一点:

综上所述,OT算法和CRDT算法各有优缺点,适用于不同的场景。如果需要实现文本的实时协同编辑,OT算法更为合适;如果需要在大规模分布式系统中实现数据一致性,CRDT算法更为合适。

CRDT不依赖于编辑器实现,使用它可以实现任意一款编辑器的协同编辑,只需要将对应的数据结构转换成CRDT的数据结构,内部会自动处理冲突和同步,并且可以不依赖中心化的服务器,在复杂的网络中表现更加稳健。

但可能存在网络先后达到顺序问题,并不能完全保证顺序是按照真实的用户意图发生,OT跟CRDT都是为了让所有的节点看到相同的内容,达到强一致性结果。

Yjs本身是一个数据结构,原理是:当两人协作时,对于文档内容修改,通过中间层将文档数据转换成CRDT数据;通过CRDT进行数据数据更新这种增量的同步,通过中间层将CRDT的数据转换成文档数据,另一个协作方就能看到对方内容的更新。

中间内容的更新是基于Yjs数据结构进行的,冲突处理等核心都是Yjs承担的,通信基于websocket或webrtc,所以我们只需要简单的使用,底层的冲突处理、光标等都不需要深入学习。

在上层Yjs支持任何大部分主流编辑器的接入,因为Yjs也可以理解为一套独立的数据模型,它与每种编辑器本身的数据模型是不同的,所以每种编辑器想要接入Yjs都必须实现一个中间绑定层,用于编辑器数据模型与Yjs数据模型转换,这个转换是双向的。

Yjs支持多种流行的文本和富文本编辑器,如

Yjs基于数据结构层面处理冲突,比OT更加稳健,对复杂网络的适应性更强。网络延时或离线编辑对数据结构来说,处理没有任何差异。

Yjs提供的Awareness(意识)模块,名如其意,让协作者能够意识到其他人的位置在哪,有效避免冲突可能性。

基于CRDT的内容合并,天然支持离线编辑,浏览器端做本地化存储。

Yjs自身提供了快照机制,保存历史版本不用保存全量数据,只是基于Yjs打一个快照,后续基于快照恢复历史版本。

THE END
1.新时代程序员都用什么写代码?俗话说的好:工欲善其事,必先利其器。一款好的开发工具对程序员来说是至关重要的,可以降低开发成本、提高开发的效率和代码质量。 所以今天分享一些主流的编程开发工具,基本都是我曾经或正在使用的,附带一些使用感受。 编程开发工具一览 本文大纲: 本地编辑器 https://xie.infoq.cn/article/e66510757d2de253686943671
2.A星算法地图编辑器A星算法地图编辑器评分: 实现的功能有导入地图,地图编辑,地图数组文件生成等。编辑器运用的java编写,大家只要把项目工程导入Eclipse运行即可进行地图编辑,本编辑可以课让你更好更直接更简便地把你的地图转化二维数组。 地图编辑器2015-07-30 上传大小:17KB https://www.iteye.com/resource/u013043346-8947575
3.算法开发:编程语言以及代码编辑器选择算法开发:编程语言以及代码编辑器选择一、 编成语言选择 python 语言的优却点: 语法简单,算法实现快,现有很多算法训练框架在很早以前就支持python,例如pytorch,tensorflow,paddle。 也有很多推理框架支持python,例如pytorch,tensorflow,paddle,openvino,tensorrt等,python语言适用于,边缘端,服务端,但不适用与移动端。 c++https://download.csdn.net/blog/column/12159765/128623998
4.《创作猫》软件中的音频编辑器支持哪些高级音频处理算法?《创作猫》是一款备受瞩目的音频编辑软件,以其直观易用的界面和强大的音频处理能力赢得了广大用户的青睐。其内置的音频编辑器支持一系列高级音频处理算法,为用户提供了丰富的音频处理工具,帮助他们实现各种音频创作需求。本文将详细介绍这些高级音频处理算法,以及它们在音频编辑中的应用。 https://www.sousou.com/bk/419732.html
5.Python常用库大全及简要说明pythonchardet:字符编码检测器,兼容 Python2 和 Python3。官网 difflib:(Python 标准库)帮助我们进行差异化比较。官网 ftfy:让 Unicode 文本更完整更连贯。官网 fuzzywuzzy:模糊字符串匹配。官网 Levenshtein:快速计算编辑距离以及字符串的相似度。官网 pangu.py:在中日韩语字符和数字字母之间添加空格。官网 https://www.jb51.net/article/178716.htm
6.Delta机器人轨迹规划算法二次开发教程.pdf4.算法编写算法编写:在算法编辑器中编写或导入控制算法,确保算法与机器人的运动模型兼容。 5.运行仿真运行仿真:点击控制面板的“运行”按钮,开始仿真过程,观察机器人的运动状态。 6.性能分析性能分析:仿真结束后,使用性能监控器分析机器人的运动性能,识别潜在的优化点。 4.2技巧与示例技巧与示例 技巧技巧1:自定义轨迹https://max.book118.com/html/2024/0810/5211132332011304.shtm
7.算法助手2.1.2新版算法助手官方手机版下载v2.1.25、高级算法和数据结构的详细讲解和示例代码 6、让用户能够深入理解和实践更加复杂的算法 7、算法助手拥有强大的算法设计和分析功能 8、用户可以使用软件中的算法编辑器 重要提示 由于更改了配置信息和数据库的存储方式,此次更新会导致旧版的数据配置全部丢失,请提前做好备份处理 更新日志 v2.1.2 新增功能: 1、新增https://www.qimu86.com/soft/86480.html
8.视频封面编辑器万兴喵影如何使用视频封面编辑器功能 免费下载免费下载 常见问题 Q3:我可以自定义AI生成的视频封面吗? Q4:使用视频封面编辑器有什么好处? Q6:AI 生成的视频封面是否能有效吸引注意力? Q7:使用视频封面编辑器需要任何设计技能吗? 了解更多功能 关键帧 运动跟踪 曲线变速 https://miao.wondershare.cn/features/ai-thumbnail-creator.html
9.ProFlow流程编辑器框架1.0发布ProFlow 流程编辑器框架 1.0 发布 本文来源:支付宝体验科技公众号 ProFlow 官网地址直达:https://pro-flow.antdigital.dev/ 在当前数字科技的业务中存在很多图展示、编辑的相关业务,大家设计方案不统一实现也不尽统一,最终导致设计与研发资源的浪费、产品体验参差不齐。为此我们设计和研发了ProFlow,提供更现代化的 UI http://daijinquan.ceden.cn/?article/1536382
10.微视频剪辑编辑器2024官方下载视频剪辑,视频去水印#微视频剪辑编辑器,快速剪辑视频,方便视频去水印;#微视频剪辑编辑器采用底层算法,快速编辑去除视频水印;#微视频剪辑编辑器-视频时长裁剪,只保留需要的小视频总分;#微视频剪辑编辑器-视频音乐提取,让好的背景音乐与你相伴;#微视频剪辑编辑器-视https://sj.qq.com/appdetail/com.app.wspjjzzbjq
11.Fleet后台探秘,第二部分–编辑器详解TheFleetBlog在本系列的第一部分中,我们概括介绍了 Fleet 架构。 在此第二部分中,我们将介绍编辑器幕后使用的算法和数据结构。 数据结构的聚合Copy heading link 请查看以下屏幕截图,其中展示了 Fleet 中的编辑器窗口 图中包含一行带有语法高亮显示的文本,以及一个提供特定变量用法相关信息的微件。 现在,人们可以通过多种方式显示http://blog.jetbrains.com/zh-hans/?p=236106/
12.Geo图中的参数值或者是 ArcGIS Schematics 的默认参数值,或者是为活动逻辑示意图关联的逻辑示意图模板特别设置的默认值(该默认值在此逻辑示意图模板的“逻辑示意图数据集编辑器”的布局选项卡中进行设置)。 迭代次数参数 迭代次数参数用于确定在显示最终结果之前“空间分散”算法将执行的迭代次数。执行一次迭代次数参数https://desktop.arcgis.com/zh-cn/arcmap/10.7/extensions/schematics/geo-spatial-dispatch-schematic-layout-algorithm-properties-page.htm
13.PseudoEditorAI神器大全免费在线伪代码编辑器,便捷高效! 标签:PseudoEditor代码保存伪代码生成伪代码编译器在线伪代码编辑学生程序员算法设计者语法高亮错误提示 访问PseudoEditor官网 PseudoEditor是什么 PseudoEditor是一款在线伪代码编辑器和编译器,由计算机科学学生在2020年设计和开发。该产品的目标是简化学生和开发人员编写伪代码的过程。Pseudohttps://aishenqi.net/tool/pseudoeditor
14.技术干货:如何高效实现地图自动拼接功能这篇文章提供了一个诸如RPG Maker、星际争霸关卡编辑器的自动拼接功能的算法和数据结构。当地图编辑器提供了这个功能,能显著加快内容创建的节奏。 二、背景 基于tile的图像现在已经是2d游戏的标志了,因为早期的2D游戏使用有限的tile来表现一个大的2D环境。这很自然地会让图像块状并且重复。但是,高超的图像艺术家会通过https://gwb.tencent.com/community/detail/105699
15.dcoder下载编辑器Dcoder编码器汉化版下载v1.7.4中文手机版- 通过解决我们的算法问题学习编码,这使你的行业准备面试。 软件特色 1、自定义建议视图。 2、多语言支持。 3、自定义菜单抽屉,自定义代码编辑器主题,编辑器的可编辑字体大小和更多! 4、彻底设计算法问题,提高编程技巧,使程序员做好行业准备。 5、文件打开/保存。 6、活动的调试视图,以便更快地访问输出。 7、https://www.qqtn.com/azsoft/550838.html
16.hexworkshop中文版十六进制编辑器6.8下载《hexworkshop中文版(十六进制编辑器) 6.8》是一款十六进制编辑器,这款软件能够帮助用户在使用函数代码的时候创建输入自己出现的算法格式,软件内的功能非常丰富,操作也很简单,是一款非常不错的软件,感兴趣的小伙伴欢迎下载使用噢! 软件功能 丰富的功能集 https://soft.3dmgame.com/down/206729.html
17.什么是数据结构?图码许多地方都有重做/撤消功能,例如编辑器、Photoshop。 网络浏览器中的前进和后退功能 用于许多算法,如 汉诺塔、 树遍历 、 股票跨度问题 和 直方图问题 。 回溯是算法设计技术之一。 回溯的一些例子包括骑士之旅问题、N-皇后问题、在迷宫中寻找出路以及所有这些问题中的类似国际象棋或西洋跳棋的问题,如果这种方式效率https://www.totuma.cn/book/desc/ds.html