学习慕课网《GO实现千万级WebSocket消息推送服务》,记录一下
一个当红主播直播间假设有100万人同时在线,每秒有1000个弹幕消息需要同步给所有在线client。服务器每秒就需要发送100万*1000(10亿)条消息。
- 难点1:内核
linux内核发送tcp的极限包频大约是100万/秒(而我们的在线人数较大,发包频率高)
- 难点2:锁
维护在线client的map
发送消息时需要遍历在线client的map,用户有上下线操作,所以需要加锁
- 难点3:cpu
client和server之间有对应的编码和解码协议,数据的编码比较耗时,100万在线,发送100万次,数据需要编码100万次
解决方案
1、内核
减少发包次数,将同一秒内的多条消息合并为1条消息,合并后每秒发送次数等于在线连接数
2、锁
将维护在线client的map分为多个小的map,每个小的map有自己的锁,client按照一定的规则路由到对应的小map中
多线程并发发送多个小的map,避免锁竞争
使用读写锁(golang)代替互斥锁,多个发送任务可并发处理同一个小的map
3、cpu
一个消息编码一次,多次发送
多条消息合并后编码
单机架构