今天和大家聊一聊协同编辑的架构设计。


什么是协同编辑

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

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

实时协同编辑

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

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

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

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

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

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

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

关于CAP定理,可以参见我的博客一文看懂CAP定理_黄腾霄的博客-CSDN博客

实施协同编辑架构抉择

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

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

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

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

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

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

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

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

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

最终一致性的处理方法

diff-patch

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

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

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

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

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

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

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

Operational Transformation

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

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

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

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

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

交互设计

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

  • 在线实时协作阶段,可以采用webrtc+Operational Transformation 保持一个良好的实时体验。

    此时操作变更较少,冲突和补偿处理也会比较轻量,对用户感知少。

  • 在出现较长时间断线,或者离线编辑的情况下,可以在连线后进行一次diff-patch,确保较大部分的改动可以同步。


参考文档:

  • 多人协同编辑的实现 · Issue #10 · Aaaaash/blog
  • 实时协同编辑的实现 - FEX
  • 协同编辑 - 维基百科,自由的百科全书
  • 2020-3-15-一文看懂CAP定理 - huangtengxiao

本文会经常更新,请阅读个人博客原文: https://xinyuehtx.github.io/ ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。

关于实时协同编辑的架构思考相关推荐

  1. PingCode Wiki 多人实时协同编辑功能发布

    PingCode Wiki 在发布之初,就是希望打造成一个面向组织的知识管理系统. 通过结构化沉淀高价值信息,形成组织完整的知识体系.通过便捷地分享和传播,轻松提升知识的流转效率,更好地成就组织和个人 ...

  2. 深入浅出 OpenSumi 协同编辑的原理

    介绍 什么是协同 信息的传播方式有很多种,文字.语音.视频.图片符号等,传统的信息传播途径存在着成本和时效性问题,以信件举例,信息生产者需要将信件整理撰写完成然后通过邮递寄给信息消费者. 随着互联网发 ...

  3. 音视频干货|深入Storyteller:实时协同Tutorial编辑器

    在刚刚结束的 RTE 2020 创新挑战赛中我提交了名为 Storyteller 的作品,其功能是一个"实时协同的交互式 tutorial 编辑器".在本文中我会深入 Storyt ...

  4. 云服务器怎么多人进去编辑文档,有道云协作怎么实现多人协同编辑 多人同时处理文档方法...

    有道云协作为用户提供了多人实时协同编辑功能,可以让协作群组中的多个用户在同一时间编辑同一份文档,互不干扰.下面,小编就为大家介绍一下这一功能,以前来了解一下吧! 类别:信息管理   大小:68.25M ...

  5. 【UE5】多用户协同编辑

    UE5新出了一个多用户协同功能所以想搭一个来玩玩. Epic已经将流程极度的简化了,在B站虚幻官方也放出了教程视频,[官方文档](多用户编辑入门 | 虚幻引擎文档 (unrealengine.com) ...

  6. python共享文件协同编辑_那些可多人协作编辑的在线文档工具

    最近使用了下石墨文档,简直就是在线版的Word,Excel,PPT,而且可以多人实时编辑预览,真的太好用了,搜索了下发现这种在线文档工具还挺多的,这里做个整理推荐. 石墨文档 这个很多人应该都用过,石 ...

  7. 多人在线编辑文档 开发_腾讯文档,支持多人实时在线协同编辑

    多年前,在港资公司工作需要多人协同编辑文档,用的是VPN+Google Docs,很早就体验过多人在线协同办公的便利,那时候,APP.微信,甚至智能手机,都没普及. 现在,就算没有VPN,用不了Goo ...

  8. Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户

    文章目录 诉求 相关技术 思路展开 相关步骤 pom配置 服务端相关配置 文本信息.用户广播处理逻辑 前端功能代码 功能测试 小结 诉求 实现页面实时在线文本协同编辑,且显示当前同时编辑文本的用户. ...

  9. 车路协同高速公路建设的思考与实践

    来源:车联界 6月15-18日,世界交通运输工程技术论坛(WTC 2021)在西安举办.本次论坛以"新技术·新模式·新交通"为主题,旨在提供酝酿创新.主导创新.展示创新和实施创新的 ...

  10. 打破技术壁垒, 用SpreadJS 抢占“表格文档协同编辑系统”的入市先机

    本文由葡萄城技术团队于CSDN原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在线文档的发展机遇与挑战 现阶段,复工复产成为企业的迫切诉求.线上 ...

最新文章

  1. Python学习之路基础篇--10Python基础,函数进阶
  2. Java中使用Jedis连接Redis对String进行操作的常用命令
  3. 语言模型微调领域有哪些最新进展?一文详解最新趋势
  4. Linux运行脚本忽略警告,ShellCheck - 显示Shell脚本的警告和建议的工具
  5. 关于zabbix_get 的介绍
  6. JavaScript数组forEach循环
  7. Mybatis-学习笔记(9)Mybatis3+spring4+springMVC
  8. pycharm控制台打印时显示内容,不用省略号代替
  9. python颜色代码棕色_图表的基本配色方法
  10. 大多数人都自我嫌弃而不自知
  11. php失物招领回复源码,失物招领系统 (1) - WEB源码|源代码 - 源码中国
  12. 64匹马,8个赛道,通过比赛,决出前四名,最少需要比赛次数
  13. ios-vcf格式通讯录的生成
  14. 使用Jmeter对服务器的压力测试
  15. 仿ofo单车做一个轮播效果
  16. Swift中的_(下划线)是什么意思
  17. 通过 Maven 命令将 jar 包推送到私服
  18. Excel多工作薄汇总——《超级处理器》应用
  19. 546计算机综合什么意思,重装系统时出现File Name?(546)的错误该怎么解决?
  20. jass——group的使用

热门文章

  1. 应用在AVR上的拼音输入法
  2. Python中列表的常用方法总结
  3. 使用octomap_server将点云地图转化为八叉树地图和占据栅格地图
  4. win10台式机,耳机插入没有声音
  5. 手机wifi java_Android中使用WIFI来连接ADB
  6. 消费品企业,会员营销四大痛点
  7. 若w=1,x=2,y=3,z=4,则条件表达式wx?w : zy?z : x的结果为 4
  8. Magick.NET Crack,支持多种文件格式的综合库
  9. Java大数据应用领域及就业方向
  10. 25.人脸关键点检测