在线协作网站是如何实现的?

638 阅读4分钟

背景

公司新开发一款流程设计器,需求明确后,后端同学三下五除二就设计了一套CURD接口拿来一起讨论,因为平常也一直在使用一些在线协作的设计网站,很难看到保存按钮的出现,都是以实时保存的方式来实现的,于是乎一起调研了一下几个比较熟悉的在线设计网站

  1. ProcessOn
  2. 墨刀
  3. Figma
  4. MasterGo 分析方式为进入编辑页面后打开开发者工具,不断的进行操作,分析网络请求,主要分析网站的保存与协作机制

开始分析

1. ProcessOn

Http请求

每次操作完成后(松开鼠标)页面都会请求如下接口:

image.png

查看接口发送数据,的确是每次操作的节点的json数据

image.png

WebSocket

进入页面后会建立如下链接:

image.png

每隔10s会互发心跳,每次操作后同样会发送操作节点的json数据

image.png

看到这里问题就来了,为什么保存的数据要发送两次呢?😐😐😐
后来还是那位后端同学的话点醒了我,我们不是还有协作模式要做嘛。协作模式这四个字很重要,如果http请求是用来保存数据,websocket是用来同步协作,那么就讲的通了
想到这里我们用A和B两个账号协作修改同一个文档进行测试。A操作时会进行http请求,发送websocket数据,B会收到websocket消息,反之亦然,验证了我们的猜测。
但是还有疑问,使用websocket就可以实现保存的同时并且进行协作了,为什么还要http请求再发送一次?个人猜测当前可能是中间过渡的方案,最终会过度到完全使用websocket

2. 墨刀

有了前面的基础,后续的分析就简单了很多

Http请求

页面编辑时没有发送http请求

WebSocket

每隔30s会发送一次心跳包,保存使用了节流处理,有操作后每隔20s发送一次保存数据,二进制数据包应该是需要保存的数据

image.png

这个节流的方案单人时不会有太大的问题,最多也就是偶尔刷新时会有一些操作没有保存。但是多人协作的时候体验就会很差,操作需要至少20s才能在协作对象的设计器内进行显示

3. Figma

Http请求

页面编辑时没有发送http请求

WebSocket

这部分figma变得复杂了许多,会建立3个链接,第一个链接与当前编辑的文档相关联,后两个不论是否在编辑页面都会一直保持着连接

image.png

只要有操作,第一个链接就会发送和接收二进制数据,控制精细度非常高,连选中也会记为操作,改动的过程中会持续进行发送。当有其他人进入协作后,会收到消息,这时鼠标移动也会发送和接收消息

image.png

第二个链接从名字看起来是用来同步文稿的版本信息,可能是使用版本来控制当前协作的文稿是否正确,发送和接收的都是json数据,可以以后再慢慢分析

image.png

第三个链接发送的也是json数据,从内容来看应该是各个面板的注册消息,有一些面板切换时会发送消息,以后再分析

4. MasterGo

Http请求

页面每隔20s会请求一次如下接口,请求内容看起来应该是埋点的操作记录,以后再分析

image.png

WebSocket

这部分的逻辑与figma基本一致,会整个站点会建立两个链接,第一个链接与当前编辑的文档相关,逻辑基本与figma保持一致

image.png

第二个链接还不清楚具体的作用和逻辑

总结

到这里我们已经分析了这四个网站大概的实现逻辑,那么我们自己系统的实现方向也就很明确了,那就是websocket加逻辑控制。但是还有一些疑问,以后慢慢再分析,清楚的同学可以直接帮忙解答一下