千万级弹幕系统技术难点和解决方案

学习慕课网《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

一个消息编码一次,多次发送

多条消息合并后编码

单机架构

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值