Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >2020-6-8-关于实时协同编辑的架构思考

2020-6-8-关于实时协同编辑的架构思考

作者头像
黄腾霄
发布于 2020-06-11 08:48:31
发布于 2020-06-11 08:48:31
2K0
举报
文章被收录于专栏:黄腾霄的博客黄腾霄的博客

什么是协同编辑

协同编辑是指多人同时对同一份文档进行编辑。

例如我们熟悉的wiki,百度百科,以及办公产品腾讯文档,乃至我们的代码管理工具git,都可以算作是协同编辑产品。

实时协同编辑

随着大家在家办公,异地办公的情况普及,实时协同编辑工具也变得更加引人注目。

实施协同编辑会面临几个问题:

  • 实时性——输入的数据可以及时被相关协作者看到
  • 一致性——各端看到和编辑的文档需要保持一致
  • 容错性——允许存在一定的网络波动,和数据丢失

但是这三个问题会形成一个不可能三角

即任意方案只能满足其中2个点,牺牲第3个点。

有的同学可能对这个三角形不是很理解。

我们可以这样类别,将协同编辑的文档类比为分布式数据库,编辑者类别为数据库的读写服务,那么我们的这个三角形就可以转换为CAP不可能三角

关于CAP定理,可以参见我的博客2020-3-15-一文看懂CAP定理 - huangtengxiao

实施协同编辑架构抉择

架构抉择第一件要做的事情是挑出哪些点是必须要满足的,哪些点是可以妥协的。

这里我们会选择实时性和容错性:

  • 实时性:保证了用户体验,让整个产品可用,毕竟用户不会期望编辑时一直卡顿
  • 容错性:实现分布式协同和远程办公的基础,也是协同的必要条件

那为什么一致性可以妥协呢?

首先我们要基于这一个假设:

在实时协同编辑的场景下,冲突是小概率事件。

就是说大部分情况下,协同编辑的参与者都会在文档的不同部分进行操作,而很少会同时对同一区域进行操作。

因此我们需要处理一致性问题的情况较少。

另外,我们只是放弃强一致性,在各端同步之后,能够较快的恢复到完全一致的状态,实现最终一致性。

最终一致性的处理方法

diff-patch

如果熟悉Git的同学,就会发现diff-patch和git的版本管理基本一致。

当出现版本冲突时,会通过diff算法计算出,两个版本之间的差异值,然后生成一个patch,将两个版本的内容合并。

这样就能让服务器端和本地端的文档内容重新保持一致。

但是diff-patch这种方式是基于文档内容比较的,那就意味着一旦出现对同一行的操作冲突,就需要人工介入,选择其中一个版本的内容。

例如git,出现合并冲突时,需要开发者对所有冲突部分进行人工处理。否则很容易出现无法运行的代码。

这种方式适用于“编辑——保存——解决冲突”的交互方式,比如kb文档。

但是要处理googledoc或者腾讯文档这样的交互就不合适了。

Operational Transformation

Operational Transformation方法是将所有的编辑行为封装成一个个的操作。

各个编辑者执行单个操作后,会将操作信息同步到各个协作端。

协作端根据操作的执行时间戳,调整文档状态,保持各端操作顺序的一致性。

注意的一点,Operational Transformation只是一种操作思想,具体的操作实现可以按照业务情况处理。

下面是我思考的两种操作方式:

  • 操作回滚法 在每个操作执行的同时,生成对应的undo,redo方法。 如果发现需要执行更早的操作,那么就先回滚已有晚于新操作时间戳的操作。 然后再按顺序执行新操作,和刚刚回滚的操作。 这种方式对于有全局状态管理的应用来说实现会比较方便,而且服务器的工作量也比较小,只需要进行时间戳的添加,以及消息的转发。
  • 操作补偿法 操作补偿法直接在服务器端维护最终的文档状态。 每次同步时,根据各端不同的状态重新生成一个补偿操作,发给对应的协作者客户端。 客户端执行补偿操作,重新和服务端状态保持一致。 这种方式不需要客户端维持一个撤销重做栈,任务被集中到了服务端。 但是在协作者增多时服务端压力会变大。 此外获取到补偿操作之前客户端会有短暂的不可用状态(避免冲突)

交互设计

在实际的应用中,我们可以采用两者结合的方式。

  • 在线实时协作阶段,可以采用webrtc+Operational Transformation 保持一个良好的实时体验。 此时操作变更较少,冲突和补偿处理也会比较轻量,对用户感知少。
  • 在出现较长时间断线,或者离线编辑的情况下,可以在连线后进行一次diff-patch,确保较大部分的改动可以同步。

参考文档:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实时协同编辑的实现
在最近某个项目中打算使用协同编辑来解决冲突问题,因此抽空调研了现有的实现方案,结果发现要想做完美是很难的,但我们可以低成本地做到不错的效果,本文将介绍几种实现方法,大家在项目中如果有需要可以参考。
一个会写诗的程序员
2020/04/09
2.4K0
初探富文本之OT协同算法
OT的英文全称是Operational Transformation,是一种处理协同编辑的算法。当前OT算法用的比较多的地方就是富文本编辑器领域了,常用于作为实现文档协同的底层算法,支持多个用户同时编辑文档,不会因为用户并发修改导致冲突,而导致结果不一致甚至数据丢失的问题。
WindRunnerMax
2023/01/09
1.2K0
初探富文本之CRDT协同算法
CRDT的英文全称是Conflict-free Replicated Data Type,最初是由协同文本编辑和移动计算而发展的,现在还被用作在线聊天系统、音频分发平台等等。当前CRDT算法在富文本编辑器领域的协同依旧是典型的场景,常用于作为实现文档协同的底层算法,支持多个用户同时编辑文档,不会因为用户并发修改导致冲突,而导致结果不一致甚至数据丢失的问题。
WindRunnerMax
2023/02/13
1.2K0
协同文档:OT与CRDT实现协同编辑笔记
典型的场景如论坛,博客,文档库,邮件。我在写这篇文档的时候,你们看不到。你们看的时候,我早已写完。异步场景下,信息的生产者会谨慎的推敲措辞,以确保自己的意思被准确的传达。表达方式的丰富性很重要,除了文本以外,段落结构,列表,示意图,表格都有利于信息的准确表达。
周陆军博客
2023/04/09
1.5K0
协同编辑中使用的 OT 算法是什么?
OT 的英文全称是 Operational transformation,是一种处理协同编辑的算法。
前端西瓜哥
2022/12/21
2.1K1
协同编辑中使用的 OT 算法是什么?
在线Excel项目到底有多刺激
加入腾讯文档 Excel 开发团队已经有好几个月了,刚开始代码下载下来 100+W 行,代码量很大但模块设计和代码质量比我想象中好好多了,今天跟大家分享下一个 Excel 项目到底可以有多好玩。 实时协同编辑的挑战 说到实时协同编辑的难点,大家的第一反应基本上是协同冲突处理。 冲突处理 冲突处理的解决方案其实已经相对成熟,包括: 编辑锁:当有人在编辑某个文档时,系统会将这个文档锁定,避免其他人同时编辑。 diff-patch:基于 Git 等版本管理类似的思想,对内容进行差异对比、合并等操作,包括 G
腾讯技术工程官方号
2020/12/17
2.2K0
一文带你了解富文本是如何协同工作的
2021年后,国外notion使用了块级编辑器,一切皆组件,一炮走红。之后块级编辑器的思路被认可,做L1的notion一样可以有自己排版布局,再加上现代浏览器国内的不断加强,似乎L1没有足够的动力升级为L2编辑器了。典型的例子有飞书和语雀,他们是有足够人力和时间来升级到L2,但实际上他们引入更多的块级组件。用来实现“一切皆对象”概念,很好的实现了互联网最大的需求,“把信息连接起来”。
爱吃大橘
2022/12/27
9480
文本文档协同编辑的实现原理
atom 编辑器新增一个 teletype 的功能,可以实现多人在线编辑代码。效果看起来挺炫酷,想了解一下是怎么实现的,于是研究了一下。
ConardLi
2021/12/27
3.3K0
文本文档协同编辑的实现原理
协同文档的技术实现
1984 年,MIT 的科学家提出了计算机支持的协同工作(Computer Supported Cooperative Work,缩写为 CSCW),使得人们可以借助计算机和互联网去完成协同工作。比如利用用于文档编辑的 Wikis 和用于编程的版本控制系统,小组成员可以在世界任意角落去共同编写大型的百科全书或软件系统
IMWeb前端团队
2019/12/03
2.8K0
协同编辑:Google Wave架构分析
Google Wave的设计初衷是让人们互相发送信息,一起编辑文档,但用户对此感到困惑,很快就以失败告终。Google Wave持续了大约一年时间,于2010年8月被关闭。
周陆军博客
2023/04/09
4190
想实现多人协作的“在线Excel”?真没那么简单
Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互界面、丰富的公式函数和易于上手的图表为我们在数据统计方面提供了不小的帮助,但经过一段时期运行,就会出现下面的情况:
葡萄城控件
2019/12/16
2.2K0
想实现多人协作的“在线Excel”?真没那么简单
想象力,工程方法以及取舍
小时候看《少儿科学画报》,深深烙在我脑海中的一个故事是「不可能先生」。史蒂文森在矿山上做了很多年蒸汽机工程师,对马车拉煤的低效深有感触,于是萌生了把蒸汽机运用在交通运输上的想法。但这个想法遭遇到了无数不可能先生的冷嘲热讽,比如「蒸汽机车不可能比马车更快」,「蒸汽机车不安全」等。他做了很多实验,遭遇了无数次失败。但最终,他通过不懈努力证明了「用火车拉煤」是一件更安全更高效成本更低廉的事情。
tyrchen
2021/07/16
6320
Google Docs系统设计
大多数商业解决方案侧重于客户端服务体系结构,以实现更精细的控制。因此,我们将关注使用客户端服务体系结构设计服务。让我们看看在这一章节中我们将如何进展。
JavaEdge
2023/11/27
3890
Google Docs系统设计
CAP理论与分布式系统设计
S 先生 是一位难得的技术同行,学者气质,一见如故。s 先生 作为本公众号(wireless_com) 的第一位投稿者,老曹深感荣幸。CAP 和 分布式系统的讨论和研究很多,但我认为这一篇肯定给大家带来不一样的收获,欢迎留言讨论。
半吊子全栈工匠
2018/08/22
1K0
CAP理论与分布式系统设计
分布式理论基础
在这一篇中主要讲述分布式基础理论知识,其中包含CAP定理,ACID以,BASE理论以及一致性协议分析.有了CAP定理的基础,能够帮助我们在根据业务特点进行分区容错一致性模型设计中提供解决问题的方向以及架构设计方案的设计与落地实现.同时需要区分数据库ACID的AC与我们的分布式AC存在的联系与差异,其次,在分布式网络中,为避免节点故障抑或是网络延迟等问题导致系统服务出现大量的不可用问题,那么对于BASE理论实现的技术方案有哪些.最后讲述分布式系统中数据的一致性问题.
keithl
2020/06/16
1.8K0
分布式理论基础
常见分布式应用系统设计图解(九):协同编辑系统
这里讲的 “协同编辑”,指的是 “Collaborative Editing”,多个人同时一起编辑同一个文件,比如说 Google Docs,国内的有有道云协作、石墨文档之类的。这样的系统倒不如我们前面提到的那些应用系统那么 “火”,但是,依然具备相当的典型性。
四火
2022/07/19
9020
常见分布式应用系统设计图解(九):协同编辑系统
谈谈分布式事务TCC机制
分布式事务是几乎所有分布式微服务系统中,最棘手也是最重要的一个点了。在讲解分布式事务前,先了解下数据库事务的特性;数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID。
程序大视界
2020/07/21
3.4K0
谈谈分布式事务TCC机制
如何保障微服务架构下的数据一致性?
随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的,微服务架构为业务开发带来了诸多好处的同时,例如单一职责、独立开发部署、功能复用和系统容错等等,也带来一些问题。
lyb-geek
2019/07/09
2K0
如何保障微服务架构下的数据一致性?
分布式事务-基础篇
百科词条:https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99[1]
一点博客
2022/03/29
3210
初探富文本之CRDT协同实例
在前边初探富文本之CRDT协同算法一文中我们探讨了为什么需要协同、分布式的最终一致性理论、偏序集与半格的概念、为什么需要有偏序关系、如何通过数据结构避免冲突、分布式系统如何进行同步调度等等,这些属于完成协同所需要了解的基础知识,实际上当前有很多成熟的协同实现,例如automerge、yjs等等,本文就是关注于以yjs为CRDT协同框架来实现协同的实例。
WindRunnerMax
2023/03/09
1.4K0
相关推荐
实时协同编辑的实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文