因商务上的需要,在工作中接触到网上文档,在线Excel。但调查阶段发现国内相关文章较少,因此结合工作实践和自己的一些思考,撰写几篇文章剖析了网上文档和在线Excel实现的一些技术方案。为避免涉及公司隐私,本文中某些数据结构的设计和非关键性场景都相当简单。本文从需求分析、方案设计、技术选型等方面介绍了如何实现多人协同在线文档。接下来,小编就将详细介绍多人实时协作的文档怎么做的相关内容,一起来看看吧。
多人实时协作的文档怎么做
需求分析
参考了领域驱动模式下的需求分析思想。要求有两个实体:人和文件。人类主要属性是:用户ID,用户名。文件主要属性是:文件ID、文件内容、创建者、创建时间。人员与文件之间的关系很简单:一个人可以有多个文件,一个文件只属于某个人,并且属于一对多关系。
由于文件内容无法随意读取和修改,因此还需要进行权限管理,权限是一个值对象。许可值是:阅读,编辑。人们可以有阅读或编辑文档的权限。
此外,最重要的问题之一是合作。协同就是多个个体,同时处理一个文档。合作过程中需要将多个人编辑的内容,经合并后转换成最终保存的文档内容。在协作过程中,需要让文档编辑者看到当前协同工作的对象和实时编辑的内容。
要实现上述功能,将系统划分为五个主要模块:人员管理、文件管理、权限管理、协作、前台文件编辑。
前置发送文档名,文档内容交给服务方。
服务台产生一个惟一的文档ID,从Token中获得用户ID,获得服务器时间,然后将这些数据一起存入数据库。
服务方将文档ID返回到前端。
修改文档
此处修改意味着对文档内容的修改。在用户编辑过程中,为了及时地保存用户编辑的内容,需要实时地将数据传送到服务端。若每一次都将文档内容全部发送到服务端,尽管服务端的处理逻辑比较简单,但每一次请求都存在大量冗余数据,浪费了大量的带宽。因此,我们最好只将更改的内容发送到服务端,让服务端根据当前文档内容和更改的内容合并产生最新的文档内容。
怎样传递更改过的内容?将用户对文件内容的操作分为三种类型:添加,修改,删除。新增加是为文档添加内容,修改是修改文档中某一部分内容,删除即是删除文档中某一部分内容。
服务者从数据库中提取文档内容,然后根据用户行为进行合并操作,最后将其存入数据库。
当编辑一篇文章时,经常需要传送大量的数据。Json的数据格式虽然可以很好地表达语意,但每次传送都要发送大量字节,浪费带宽;同时,Json的串行化、反序列化过程效率较低。而Google的Protobuf协议则是基于二进制的传输协议,在内容大小和解析速度方面均优于Json。
在多个人同时修改一个文档时,可以采用多种方法处理内容冲突:
文件锁定:当某人修改了一个文档,对整个文档加写锁定,其他人只能看到不可编辑。尽管实现很简单,但是协作的体验尤其糟糕。
diff+patch的合并算法:diff+patch是文档内容比较和合并的常用算法,Linux本身提供对diff和patch命令的比较和合并功能。git还使用diff+patch方法合并文件,在不能解决冲突的情况下,将冲突抛给用户手工合并。
OT算法:与diff+patch相比,OT算法常常能得到更好的合并效果。但是OT算法的实现也比较复杂。当前Google文件,腾讯文件,石墨文件等均采用OT算法。在后面的文章中,我们将分别讨论diff+patch和OT算法。
协作通知
要想更好地合作,文档编辑人员需要同时查看文档编辑人员,还要查看其他人修改过的内容,以减少冲突,并达成合作。
每个人打开文档编辑页面的时间是不同步的,为了让大家看到彼此,又看到对方修改过的内容,需要服务端主动为客户端推送消息。这种情况下,较适合采用长链路的方案。
前面还提到,经常修改文档时,数据的发送频率会很高,如果是HTTP请求导致每次请求都带有头信息,建立连接等开销,因此修改文档内容的数据上报也可以使用长链接。与此同时,服务端维护一个协作列表,以保存正在编辑的文件和文档的在线用户,类似于一个聊天室。
文件修订程序加入。
当前端打开文档时,将请求发送到服务端,服务端检查协作列表中是否有当前文档。如有,请将当前用户加入到该文档修改者列表中;如果未将当前文档添加到协作列表中,并将当前用户ID写入。服务者将一个长链接发送到文档列表中的所有其他用户推送消息,告诉每个人都加入了合作。在不需要讨论的情况下,文档修改者退出逻辑和加入基本相同。以上就是多人实时协作的文档怎么做的相关内容,感谢您的阅读。
[免责声明]
文章标题: 多人实时协作的文档要怎么做
文章内容为网站编辑整理发布,仅供学习与参考,不代表本网站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时沟通。发送邮件至36dianping@36kr.com,我们会在3个工作日内处理。