Go结合Websocket实现用户实时弹幕推送

一、概述

1、使用场景

在斗鱼、虎牙等直播平台,经常会看到直播间屏幕上飘满了弹幕。

但有没有思考过其中是如何实现的,要知道,如果一个直播间的弹幕消息每秒500条,一小时产生的数据量就会是180万条,如果是将这些消息存储到MySQL数据库,首先MySQL数据库肯定扛不住这样的高并发,其次,也很难去做到弹幕实时飘在屏幕上。

所以使用MySQL实现弹幕直播间弹幕功能首先就被排除掉。那有什么其他方式,可以实时将消息推送到所有直播间观众的屏幕上呢。想必你一定会想到,使用Websocket协议。

没错,这里就是使用Websocket协议来做这件事情,Websocket协议与http协议一样,都是基于tcp传输层,不同之处在于http协议是短链接,而Websocket协议是长连接。

 

2、弹幕系统的技术挑战

1个直播间100万人,每秒发送的弹幕数量是1000条,想要将弹幕推给100万人,那每秒的推送量就是10亿。

对于一个直播平台,肯定不止一个大主播,那n个大主播的直播间加起来,整个平台需要每秒需要推送的数量可能就达到了100亿甚至更多。

 

3、拉模式与推磨式的区别

在实际工作中,我们在实现弹幕系统或聊天系统时,我们可能都会选择使用拉模式,因为拉模式实现起来非常简单。

(1)拉模式

拉模式就是客户端定时去轮询服务端提供的接口,获取到最新的数据。但拉模式是存在很多问题的,比如:

  • 数据更新频率低,则大多数请求相对来说是无效的。

  • 在线用户数量多,则服务端的查询负载将会很高。

  • 拉模式是定时拉取,也就无法满足时效性要求

(2)推模式

仅在数据更新时,才会进行数据推送,省去了拉模式的很多无效轮询,但是需要维持大量的在线长连接。

推模式下,可以实现数据推送的高时效性

 

4、选择什么协议做推送

看直播一般是浏览器或者是手机app,而想在浏览器做长连接,基本只能选择Websocket协议,通过websocket,可以轻松实现服务端与客户端的长连接。

websocket与http一样,都是基于tcp可靠传输协议基础上,无需开发者关注通讯细节。

 

5、websocket协议与交互

传输原理:

协议升级后,继续复用Http的底层socket完成后续通讯,连接不中断

message底层会被切分成多个frame帧进行传输,编程者只需要关注message,无需关注底层是否被协议切分成多个frame

 

6、选择Go做服务端的原因
  • 多线程,基于协程模型并发

  • 有成熟的websocket标准库,无需造轮子