千万级弹幕系统的架构
3个性能瓶颈
- 内核瓶颈
- 推送量大:100万在线 * 10条 / 秒 = 1000万条 / 秒
- 内核瓶颈:Linux内核发送TCP的极限包频 ≈ 100万 / 秒
- 锁瓶颈
- 需要维护在线用户集合(100万在线),通常是一个字典结构
- 推送消息即遍历整个集合,顺序发送消息,耗时极长
- 推送期间,客户端仍旧正常上/下线,所以集合需要上锁
- CPU瓶颈
- 浏览器与服务端通常采用json格式通讯
- json编码非常消耗cpu资源
- 向100万在线推送1次,则需100万次json encode
解决方案
- 内核瓶颈 - 优化原理
- 减少网路小包的发送
- 内核瓶颈 - 优化方案
- 将同一秒内的N条消息,合并成一条消息
- 合并后,每秒推送次数只等于在线连接数
- 锁瓶颈 - 优化原理
- 大拆小
- 锁瓶颈 - 优化方案
- 连接打散到多个集合中,每个集合有自己的锁
- 多线程并发推送多个集合,避免锁竞争
- 读写锁取代互斥锁,多个推送任务可以并发遍历相同集合
- CPU瓶颈 - 优化原理
- 减少重复计算
- 锁瓶颈 - 优化方案
- json编码前置,1次消息编码 + 100万次推送
- 消息合并前置,N条消息合并后只编码1次
单机架构图
单机瓶颈
- 维护海量长连接会花费大量内存
- 消息推送瞬时消耗大量CPU资源
- 消息推送瞬时带宽高达400~600MB(4-6 Gbits),是主要瓶颈
分布式架构图