线上问题不过夜:WebRTC 生产故障排查与修复作战手册
WebRTC 线上故障的典型特征是“用户体感强、问题链路长、根因跨团队”。同一句“卡顿”,可能来自信令重协商冲突、ICE fallback、SFU 队列拥塞、端侧编码过载,甚至是地域路由漂移。没有系统化排障方法,值班会陷入“每次都从头猜”。本文给出一套可执行的生产排障体系,目标是缩短 MTTR,并把临时止血转化为长期治理。
一、故障分层模型:先分层,再定位
建议将 WebRTC 故障分为五层:
- 接入层:鉴权、信令连接、会话创建。
- 建连层:SDP 协商、ICE candidate 交换、连通性检查。
- 媒体层:编码、转发、解码、播放。
- 网络层:RTT、丢包、抖动、跨区路由。
- 资源层:节点 CPU、带宽、队列、TURN 容量。
值班时第一件事不是查日志,而是判定故障层级。层级判错,会导致排障方向完全跑偏。
二、故障响应流程:15 分钟止血、60 分钟归因
推荐响应 SLA:
- 0-5 分钟:确认影响范围与级别。
- 5-15 分钟:执行止血动作(降级、限流、切流、回滚)。
- 15-60 分钟:收集证据并形成初步根因。
- 24 小时内:输出复盘与预防动作。
关键是“先止血,再求全责备”。生产故障中,业务连续性优先于技术完美。
flowchart TD
A[告警/用户投诉] --> B{影响范围评估}
B -->|广泛影响| C[P1 应急流程]
B -->|局部影响| D[P2/P3 排查流程]
C --> E[执行止血: 降级/回滚/切流]
D --> F[分层定位: 信令/ICE/媒体/资源]
E --> G[证据采集与会话快照]
F --> G
G --> H[初步根因结论]
H --> I[修复方案与验证]
I --> J[复盘与防复发任务]
三、架构设计视角:为了可排障而设计系统
很多系统“功能可用但不可排障”,根因是架构缺少可观测性设计。建议在架构层面预置:
- 全链路会话 ID(客户端、信令、SFU、TURN 统一)。
- 关键状态事件(offer/answer、ICE 状态、层切换、降级动作)。
- 错误码标准化(统一语义、统一级别、统一可检索)。
- 快照机制(出现异常时自动抓取关键统计与日志)。
可排障性不是后期补丁,而是架构目标之一。
四、常见故障模式与快速判断
模式 A:建连失败率突升
快速判断:
- 信令握手是否正常。
- ICE 状态是否卡在 checking。
- relay 占比是否突然上升。
止血动作:
- 强制开启稳定 TURN 路径。
- 临时降低候选复杂度,缩短检查窗口。
- 回滚最近信令版本。
模式 B:通话中途大面积卡顿
快速判断:
- SFU 队列时延是否上升。
- 节点 CPU/带宽是否接近上限。
- BWE 是否异常震荡。
止血动作:
- 全局降级视频层,音频保底。
- 启用热点房间分片。
- 限制非关键流优先级。
模式 C:区域性质量劣化
快速判断:
- 区域链路 RTT/丢包是否异常。
- 是否发生路由偏移或节点故障。
- 某运营商是否集中异常。
止血动作:
- 切换接入区域和 TURN 节点。
- 临时调整路由策略。
- 对异常运营商启用保守编码策略。
五、质量治理:把事故指标转成长期改进指标
每次故障后,至少沉淀以下数据:
- MTTD(发现时长)。
- MTTR(恢复时长)。
- 影响会话数和影响时长。
- 根因分类(信令/ICE/媒体/资源/变更)。
- 止血动作有效性。
治理目标不是“事故清零”,而是“同类事故规模和恢复时长持续下降”。
六、容量与成本联动排障:避免“止血动作把账单打爆”
生产止血常见副作用是成本激增,例如全量强制 TURN、过度冗余重传。建议建立“应急成本看板”,实时观察:
- relay 占比。
- 跨区流量。
- 节点单位会话成本。
- 资源利用率。
应急动作要有“成本上限”,超限时触发二级策略(例如限制低价值视频流),避免故障演变为财务事故。
七、排障工具链:最小可用组合
生产环境至少应具备:
- 会话级时间线视图。
getStats与服务端事件关联查询。- webrtc-internals/浏览器调试导出。
- 节点指标实时面板。
- 一键生成事故报告模板。
工具不在多,在于是否能快速回答三个问题:哪里坏了、为什么坏、现在怎么止血。
八、故障演练:没有演练就没有可靠值班
建议每月进行场景化演练:
- 信令网关抖动。
- 单地域 SFU 故障。
- TURN 服务部分不可用。
- 客户端错误版本灰度放量。
- 跨区链路时延突增。
演练输出必须包含:响应时间、操作步骤、瓶颈点、改进任务和责任人。只做“演练通过”没有价值。
九、组织协同:明确战时分工,减少沟通损耗
推荐角色分工:
- IC(Incident Commander):统一决策与对外同步。
- 媒体负责人:处理 SFU/编码/调度问题。
- 网络负责人:处理 ICE/TURN/路由问题。
- 客户端负责人:处理版本与终端适配问题。
- 记录员:实时记录时间线与动作。
战时最怕“多人同时改、无人负责”。明确角色能显著降低恢复时间。
十、复盘模板:从“事故纪要”升级为“防复发系统”
高质量复盘应回答:
- 触发条件是什么。
- 为什么监控没有提前发现。
- 哪个止血动作最有效,哪个无效。
- 哪些系统设计缺陷导致问题放大。
- 需要哪些长期改造、负责人和截止时间。
并将结果写入“故障模式库”,下次值班可按模式直接执行预案。
十一、实操检查单
故障发生前,确保:
- 关键指标和告警覆盖核心链路。
- 策略版本可追溯且可回滚。
- 值班手册包含 15 分钟止血动作。
- 每个故障层级有默认负责人。
- 历史高频故障有对应自动化检测。
这些准备工作看似基础,却决定了故障时能否稳住局面。
结语
WebRTC 生产排障不是“大神经验合集”,而是可制度化、可训练、可持续优化的工程体系。把分层定位、应急止血、容量成本和复盘治理串成闭环,才能让线上问题真正“不过夜”。