一、概述
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标准库,无需造轮子