从单机到多地域:WebRTC SFU 扩展架构的实战设计与治理
SFU 架构的难点从来不在“能转发 RTP”,而在“高峰时还能稳定、低成本、可排障地转发 RTP”。很多团队在百人以内表现不错,一旦扩到千人房间或跨地域会议,立刻暴露出控制面混乱、节点热点、队列积压和成本失控。本文给出一套面向规模化业务的 SFU 架构方法,覆盖设计原则、治理体系和故障闭环。
一、SFU 的核心职责:做选择,不做重编码
SFU(Selective Forwarding Unit)的价值是选择性转发:
- 选择发谁的流。
- 选择发哪一层流。
- 选择以什么优先级发。
它通常不做全量转码,因此比 MCU 更省算力,但这不代表系统简单。复杂度从编码转移到“调度决策”:一旦调度策略不稳定,体验和成本都会同时恶化。
二、架构设计蓝图:媒体面与控制面必须分离扩展
建议将 SFU 系统分为四层:
- 接入层:会话路由、鉴权、就近接入。
- 控制层:房间编排、订阅关系、层策略、节点调度。
- 媒体层:SFU Worker 处理 RTP/RTCP、NACK、PLI、TWCC。
- 观测层:指标、日志、追踪、会话快照。
媒体层按 CPU 核心和网卡能力水平扩展;控制层按会话数和请求吞吐扩展。两者扩容节奏不同,必须独立伸缩。
flowchart TB
U[用户终端] --> E[边缘接入网关]
E --> C[控制平面: 房间编排/订阅策略]
C --> R1[SFU Region A]
C --> R2[SFU Region B]
R1 --> W1[Worker Pool A]
R2 --> W2[Worker Pool B]
W1 --> O[观测与告警平台]
W2 --> O
O --> SRE[SRE 值班与自动化处置]
三、多地域扩展:先解决“在哪里转发”,再解决“怎么转发”
跨地域系统中,选择接入点和转发点决定了用户时延上限。常见策略:
- 就近接入 + 区域内转发:适合互动密集、跨区较少场景。
- 就近接入 + 跨区级联:适合全球会议,减少全员跨区流量。
- 核心区域汇聚:实现简单,但跨洲体验与成本压力大。
实践建议:
- 以“主讲者所在区”为优先汇聚依据,减少关键视频跨区跳数。
- 对观众多、互动低场景使用边缘只下发,减少上行跨区。
- 为区域间链路设置独立健康探针,避免静态路由长期劣化。
四、房间编排与节点调度:防热点比追极限更重要
SFU 扩展失败的常见原因是节点热点。某些热门房间、明星主播、培训课堂会把负载集中到少数节点。
有效调度机制包括:
- 预估负载模型:基于房间规模、上行路数、层数估计资源需求。
- 分片策略:超大房间拆分子房间或子拓扑。
- 迁移策略:在会中迁移低优先级订阅,降低热点节点压力。
- 保护阈值:CPU/带宽/队列达到阈值时拒绝新订阅或降级。
不要迷信“自动扩容能解决一切”。扩容有冷启动延迟,热点往往在分钟级形成。必须有即时降级手段兜底。
五、媒体调度策略:音频保底、关键视频优先、其余自适应
在拥塞或高负载场景,调度策略应遵循:
- 音频最高优先级,保证会话可沟通。
- 主讲/屏幕共享优先于普通视频。
- 低价值流优先降层、降帧或暂停。
- 切换动作要限频,避免抖动。
若你把所有流一视同仁,系统在压力下会“平均变差”,用户主观感受更糟。
六、质量治理:从“可用”升级到“稳定可预期”
建议建立四组核心指标:
- 房间层:首帧时长、订阅成功率、中断率。
- 节点层:CPU、带宽、队列延迟、丢包。
- 流层:关键流冻结率、层切换频次、音频卡顿率。
- 运营层:投诉率、会话时长、转化与留存影响。
治理动作应制度化:
- 每次策略变更必须有灰度计划与回滚条件。
- 每周复盘热点房间和 Top 故障会话。
- 对关键版本执行故障演练(节点下线、跨区断链、控制面故障)。
七、容量规划:别只算并发人数,要算流拓扑复杂度
常见容量误区是“并发人数 × 平均码率”。实际还要考虑:
- 每人上行层数(Simulcast/SVC)。
- 平均订阅关系密度(谁看谁)。
- 关键流比例(主讲/屏幕共享)。
- TURN 占比与跨区比。
容量模型建议至少输出三组结果:
- 正常日 50/95 分位资源占用。
- 高峰日突发场景资源上限。
- 故障日(单区降级)资源承压上限。
有了这三组结果,扩容预算和应急预案才有现实意义。
八、成本治理:SFU 成本不是单一带宽账单
SFU 成本主要由以下部分组成:
- 出入网带宽成本。
- 计算资源成本(媒体线程、加解密、队列处理)。
- 跨区链路成本。
- 中继成本(TURN 占比)。
降本动作应优先做“无感优化”:
- 降低低价值流层级上限。
- 优化跨区路由,减少不必要回源。
- 对空闲订阅快速收敛。
- 在可接受范围内动态调整冗余策略。
“极端压码率”通常会带来体验下滑,最终反噬业务指标,不是长期可持续方案。
九、生产排障:构建一条从投诉到根因的标准链路
建议建立会话级排障视图,至少包含:
- 会话拓扑图(参与者、节点、跨区路径)。
- 关键时间线(建连、层切换、重传峰值、降级动作)。
- 节点资源快照(CPU/队列/带宽)。
- 信令与媒体事件关联。
高频故障模式与处理:
- 某房间全员模糊:检查主节点队列与层策略是否过度降级。
- 局部用户卡顿:检查该用户所在区域出口链路与 TURN 路由。
- 会中突然掉线:检查控制面会话状态漂移或节点重启策略。
- 成本突增:检查 relay 占比、跨区比例和异常重传。
故障处置目标是“先止血、再根因、再预防”。值班手册必须明确 15 分钟止血动作。
十、实施路线图:避免一次性重构风险
推荐三阶段推进:
- 观测先行:先补齐指标与会话追踪,再动调度策略。
- 策略灰度:按地区和房间规模逐步启用新调度规则。
- 架构升级:在指标稳定后做多地域级联和自动编排。
每个阶段都要有可量化验收标准,否则很容易变成“做了很多改造,收益无法证明”。
结语
SFU 扩展不是单纯的“横向扩容”,而是一个持续优化的系统工程。只有把架构、策略、治理、容量和排障放在同一套机制里,平台才能在业务增长中保持稳定和可控成本。