百万级弹幕推送没有单一的架构选型,它由接入层、总线层、业务层、存储层四段链路决定;真正影响全局的是连接网关与消息总线的取舍,多数情况下,WebSocket网关加Kafka削峰就能撑起直播间百万级弹幕。
我做过几年直播平台的后端,几乎每天都在跟弹幕打架,弹幕这东西,跟普通IM消息不一样,它允许丢,但绝不能堵,一堵,用户看到的是屏幕静止,主播看到的是观众在骂,所以我想把弹幕推送架构的选型思路,用最直白的方式拆开讲。
弹幕推送架构选型对比:WebSocket百万连接方案怎么选
行业的共识在于,在线互动直播的弹幕推送,连接层是最难啃的骨头,业内专家指出,接入层选的不是框架,选的是并发模型和运维边界。
WebSocket与自研TCP协议:直播弹幕场景到底怎么选
微信和QQ这类IM,用的是自研私有TCP协议,原因是它们要求消息绝对可靠、绝对有序,还要做多端同步,弹幕没有这么重的诉求,WebSocket直接跑在80和443端口上,复用现有Web生态,穿透大部分企业防火墙,这是自研TCP协议做不到的。
自研TCP协议的优势在低延迟和包头开销,但在百万连接场景下,一个明显的劣势暴露出来:客户端环境太杂,Web端、iOS端、安卓端、甚至部分电视端,每一端的网络栈行为都不一样,自研协议每个端都要适配,光是弱网重传策略就够维护一两年。
| 对比维度 | WebSocket | 自研TCP私有协议 |
|---|---|---|
| 握手成本 | 基于HTTP升级,有额外开销 | 协议精简,开销更低 |
| 服务端框架成熟度 | 高,有成熟的连接库与压测工具 | 低,核心逻辑全部自研 |
| 跨端兼容性 | 好,天然支持浏览器 | 差,每个端都要开发 |
| 消息有序性 | 靠应用层做序号管理 | 协议层可做分片与序号 |
| 运维排障成本 | 低,抓包可读性强 | 高,需要定制解析工具 |
从我接触的实际项目来看,除非你的弹幕承载着交易指令或者强管控信号,不然WebSocket就是最省成本的方案。百万级连接的WebSocket网关,TCP协议栈调优和内存管理远比框架选型更重要。
接入网关选型:Nginx、Envoy还是自研长连接网关
连接层架构有个常见的误区,就是让业务框架直接暴露给公网,很多团队直接用Netty或者Go的WebSocket库对外提供服务,一旦遇到百万连接,就要面对两件麻烦事:TLS终止的性能开销,以及四层负载均衡的瓶颈。
Nginx在百万连接场景下是标准的流量入口,它做TLS终止,转发给后端的WebSocket业务集群,Nginx配置里有个容易被忽视的参数,

worker_connections,默认只有1024,调高到10万以上的同时,必须同步调大worker_rlimit_nofile。
Envoy与Nginx的取舍,核心看两点:你是否需要动态的服务发现与按连接粒度做限流,Envoy支持基于metadata的路由,可以在不重启的情况下调整某个直播间的连接路由策略,如果团队没有Service Mesh基础,Nginx的配置热加载已经够用。
自研长连接网关值得投入的场景只有一个:你需要把连接与业务状态完全解耦,比如网关只负责维持连接和转发帧,业务逻辑收归到独立的弹幕服务,你还要设计网关自身的集群横向扩容机制,这通常意味着写一套连接迁移协议。
百万连接压测的实操路径:从握手日志到内存监控
很多开发者在本地模拟一万连接,觉得一切正常,上了生产就崩,因为百万连接场景下,压测工具本身就成了瓶颈,建议直接用生产环境的真实流量灰度,或者用分布式压测集群。
具体操作路径分四步:
- 先做单机压测,用Go或C编写压测客户端,单机模拟5万连接,观察服务端CPU、内存与文件描述符变化。
- 再调内核参数,
net.core.somaxconn调大到65535,net.ipv4.tcp_tw_reuse开启,net.ipv4.ip_local_port_range放开到动态端口段。 - 接着监控JVM或Go runtime,重点看堆外内存与GC暂停时间,大量WebSocket帧对象会堆积在新生代。
- 最后做断线重连压测,模拟3%的客户端同时闪断,观察SYN队列溢出情况。
我在压测中踩过的最深的坑是:Linux默认的net.core.rmem_max只有208KB,一旦窗口缓存不足,客户端看到的就是延迟飙升,而服务端CPU负载看起来并不高。
高并发弹幕系统的推送链路成本预测:自研与开源对比
聊完连接层,下一个核心问题是推送链路到底要花多少钱,直播弹幕服务器价格不是按台算的,而是按链路算的。连接层、总线层、存储层每一段的资源消耗逻辑都不一样,成本模型要分开建。
连接层的带宽与内存账
先算带宽,一条弹幕消息平均不到100字节,给100万用户广播一次,理论上要发送100MB数据。但实际场景中,直播弹幕有非常强的扇出效应,单个房间同时在线用户数量几乎不可能达到百万,多数情况下是数个热门的房间加起来百万连接。
如果按单房间5万连接算,一次广播的数据量是5MB左右,按每秒广播20次,需要100MB的出口带宽,选购云服务器的带宽计费时,这个量级对应的直播弹幕服务器价格会明显偏高。
内存方面,连接状态本身是最大的内存消耗者,每个WebSocket连接平均占用约2KB到3KB上下,一个8GB内存的节点大约能支撑2万到3万连接,按这个估算,百万连接至少需要40个节点。

总线层:Kafka在百万弹幕场景里的真实定位
弹幕推送链路里,Kafka是绝大多数团队的选择,但很多人忽略了它在这里的两个特殊使用方式。
第一个方式是削峰填谷,弹幕进Kafka,用消费组把弹幕写入事件分发给下游业务服务,弹幕请求量瞬间翻倍时,Kafka自带缓冲,业务侧不会因为峰值而被打垮。
第二个方式是消息回放,用户断线重连后需要拉取缺失的弹幕,如果从Redis或者数据库里找回放,压力极大,Kafka自带的消息持久化与按offset消费能力,天然支持向客户端补发。
但Kafka并非银弹,弹幕消息对延迟极度敏感,如果消费端积压超过5秒,直播间的弹幕墙就会出现明显空洞。为避免积压,弹幕业务服务的消费线程数,要为峰值预留两倍以上的冗余度。
据Kafka官方文档描述,单个分区可以支撑每秒数万次的消息写入,所以做弹幕总线时,不要把Kafka当数据库用,它只是短暂停留的传送带。
存储与回放成本:弹幕系统技术方案多少钱才能存下
弹幕存储是成本占比较大的隐性模块,一套弹幕系统技术方案多少钱,很大程度取决于你要存多久的弹幕。
冷热分离是弹幕存储成本控制的核心思路:
- 热数据存在Redis或内存,保留最近5分钟。
- 温数据存在ClickHouse或ES,保留最近7天。
- 冷数据归档到对象存储,压缩存原始数据包。
弹幕回放按时间片分段读取,用户拖拽进度条后,先取热窗口的本地缓存,再向后端请求温数据的分片URL,这样一来,存储成本可以压到纯数据库方案的十分之一以下。
弹幕推送架构选型的稳定性设计:从抢红包到超管禁言
选型不只要看日常流量,更要看极端业务动作下的表现,弹幕推送架构最典型的压力测试有两个:抢红包瞬间的弹幕洪峰,以及超管对全站房间执行禁言指令。
总线下游的雪崩:如何让弹幕服务在热点直播中安全运行
弹幕消费服务最怕的是自己成为瓶颈,Kafka的消费线程把弹幕写入内存队列,再由分发线程推给各房间的连接,这里有个隐藏风险:某个超级大主播临时开启抽奖,弹幕流量瞬间暴涨数倍,内存队列耗尽,GC开始疯狂工作,服务整体卡顿。
兜底方案是分级丢弃策略,弹幕消息分三类:控制消息、普通弹幕、抽奖弹幕。优先保证控制消息的投递,比如系统公告、禁言、踢人,普通弹幕在队列水位超过80%时直接丢弃,抽奖弹幕有单独的容量配额。
控制消息与普通弹幕要放到不同的Kafka Topic里,控制消息用高优先级消费组,普通弹幕用低优先级消费组。

这个架构能保证即使普通弹幕积压了几百万条,超管禁言指令依然在毫秒级送达。
弱网体验:断线重连与消息补偿的关键细节
弹幕推送最常见的用户投诉是:一掉线重连,弹幕就断片了。连接层要做的是局部消息序号与增量补偿机制。
具体做法是,每个房间为每个连接维护一个递增的seq序号,服务端推送弹幕时带上当前seq,客户端本地保存最近收到的seq,断线重连后,客户端发起带起始seq的同步请求,后端从Kafka或内存缓存中拉取这个区间内的消息补发。
这里有个细节容易被忽略:补发弹幕的数量必须限制,如果用户断线了10分钟,全量补发就是灾难,一般只补最近30秒到60秒的弹幕,更早的内容靠用户手动拖动进度条加载。
弱网场景下的另一个优化是弹幕合并广播,同一秒内多个用户发送相同内容的弹幕,服务端可以合并为一条消息带上计数,推送给所有客户端,这个方案能减少约三成到四成的广播数据量,对带宽和客户端渲染压力都有明显改善。
弹幕推送架构选型不是一锤子买卖
选型之前,先用你最极端的业务场景做压测,再决定自研边界。如果只是做直播间弹幕,WebSocket加Kafka,再加一套分级的丢弃策略,已经是经过验证的稳妥架构,如果业务要承载复杂的消息协议与强管控能力,再考虑自研TCP网关与定制消息序列,那是一条更重且更长的路。
架构选型的终点不是技术推导,而是可维护性与故障成本的平衡。
弹幕推送架构选型Q&A:百万连接决策的三个高频问题
自研WebSocket网关时最需要关注的技术点有哪些?
连接状态的维护与连接迁移是核心,自研网关要解决灰度发布时的平滑迁移,客户端断开重连的时间窗口要控制在秒级以内;同时要建立连接维度的metrics采集,能实时看到每个房间的连接数、广播延迟与重连率。
用云厂商的负载均衡配合开源的WebSocket组件是否可行?
可行,云上的CLB或SLB直接暴露TCP端口,后端挂载WebSocket服务集群,用云资源的弹性扩容弥补自研网关的运维成本,直播弹幕服务器价格取决于同时在线峰值与消息量级,云上按量付费的带宽计费模式,更适合流量波动明显的直播场景。
Kafka消费能力跟不上弹幕增长怎么办?
扩容比换组件更优先,先按房间维度做消息分区,增加消费者实例,同时调大拉取批次大小与线程数,消费端逻辑要精简,只做弹幕写入内存队列和状态更新,不做任何IO操作,如果依然积压,考虑在消费端做样本采样,对低热度房间的弹幕做降级丢弃,保证高热度房间的弹幕完整投递。