Skip to content

千万级弹幕系统的架构

3个性能瓶颈

  1. 内核瓶颈
    1. 推送量大:100万在线 * 10条 / 秒 = 1000万条 / 秒
    2. 内核瓶颈:Linux内核发送TCP的极限包频 ≈ 100万 / 秒
  2. 锁瓶颈
    1. 需要维护在线用户集合(100万在线),通常是一个字典结构
    2. 推送消息即遍历整个集合,顺序发送消息,耗时极长
    3. 推送期间,客户端仍旧正常上/下线,所以集合需要上锁
  3. CPU瓶颈
    1. 浏览器与服务端通常采用json格式通讯
    2. json编码非常消耗cpu资源
    3. 向100万在线推送1次,则需100万次json encode

解决方案

  1. 内核瓶颈 - 优化原理
    • 减少网路小包的发送
    • 内核瓶颈 - 优化方案
      1. 将同一秒内的N条消息,合并成一条消息
      2. 合并后,每秒推送次数只等于在线连接数
  2. 锁瓶颈 - 优化原理
    • 大拆小
    • 锁瓶颈 - 优化方案
      1. 连接打散到多个集合中,每个集合有自己的锁
      2. 多线程并发推送多个集合,避免锁竞争
      3. 读写锁取代互斥锁,多个推送任务可以并发遍历相同集合
  3. CPU瓶颈 - 优化原理
    • 减少重复计算
    • 锁瓶颈 - 优化方案
      1. json编码前置,1次消息编码 + 100万次推送
      2. 消息合并前置,N条消息合并后只编码1次

单机架构图

Image title

单机架构图

单机瓶颈

  • 维护海量长连接会花费大量内存
  • 消息推送瞬时消耗大量CPU资源
  • 消息推送瞬时带宽高达400~600MB(4-6 Gbits),是主要瓶颈

分布式架构图

Image title

分布式架构图