基于 Go 的协同系统深度实践

导读

本文介绍的是基于网页端的操作协同,常见于教学、游戏等场景。由 TutorABC 架构师张新宇在Gopher Meetup 上海站上进行的演讲整理完成。

内容结构:

  1. 协同概念及应用

  2. Go 服务端设计

  3. 主要技术点及解决方案

(编辑整理:李平平)

01

协同概念及应用

各位下午好,我是TutorABC音视频的架构师,主要是跟大家分享一下我们在TutorABC产品实践当中的心得体会。开始之前我跟大家交流一下什么是协同?这个是百度上面的说明,和传统意义的协同不一样,我今天演讲的是一种多人交互式的,在同一个黑板上或者是在一个房间里面交互式的协同。

简单描述就是这样的,比如说大家在一个IDE里面编写代码,你的编写的内容会同步传输到另外一个人的网页端,并且你可以使用编译结果同时广播到两个地方,大家都可以看到你的编译的结果,那这个是最基本的协同方式,原理上也很简单,传递的只是在你的浏览器中改动,这个是最基本的应用。

稍微高级一点的就是我们需要捕捉不但是传字符还需要捕捉你的鼠标在dom上面的事件,点击,拖动,双击会有捕捉,把这些事件转化成文本的内容传递给对方,在dom上面进行汇总。

这个是我们ABC的产品,在一个桌面上面进行基本操作,比如:绘画、文字、放大缩小等,这些东西会在远端比如说学生的pad上面在另外手机上面会有同步的显示,这个是最基本的协同。当然,我们还有编程模式,这个是高级的协同,大概是这样的。我们看到白板上显示的并不是像刚刚看到的是一个图片,可以在上面画,这个上面实际上是一个远程桌面,远程桌面的引入就可以让老师可以去教一些更高级的东西,比如说PS,CAD,还有C++,Golang等等带GUI特性的东西,可以引入到网页端。

02

go服务端设计

我现在分享一下我们在上面的一些实现,讲一下我们的技术栈,是通过websocket,服务器的后端都是通过Tcp,传输协议有protobuf和fjs,还有rfb、rdp是远端桌面协议,这个是我们处理的协议,开发语言是GO,主要是GO然后一些关键的地方是用的C++,前端是用的js,依赖的库有websocket,Freerdp,libvnc还有cairo的库。

这个图我刚刚说的最简单的不带远程桌面的实现,实际上最核心的技术是劫持操作者在网页上面所有的动作(DOM变化),我们会注入代码把你的动作捕获到,然后把它编译成我们的代码,然后传输通过websocket传输到网关上面,网关就是负责将所有的传入数据收集到HUB上面进行转发,这样代码可以在远端进行重汇,再基于这个之上是基于远程桌面的协同,我们的远程桌面是通过HUB建立了连接器,这个connector会做虚拟机的连接或者是vm容器的连接,并且把对方发过来的这种RFB,RDP的协议进行转码,在connector的内存里面保留一个内存进行图形的渲染,并且根据每个客户端的请求,比如说他是到了哪一祯了进行请求差异的传输,gateway传输到不同的浏览器上面进行绘画。

架构图<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值