把它做成生产功能之前,需要先拆开协议事实、产品承诺和运行成本,三者混在一起很容易得到错误结论。 候选列表里出现 relay 不代表当前使用中继,出现 host 也不代表局域网直连。只有 transport 指向的 selectedCandidatePairId,或明确 nominated 且 succeeded 的唯一候选对,才是当前路径证据。
WebRTC 的判断依据必须来自两端状态、信令版本和实际选中的候选对。只看某个浏览器回调会遗漏 glare、ICE 切路与对端刷新造成的分叉。
落地方案的关键部件
实现之前先列出不可违反的不变量,再为性能与体验留出调节参数。参数可以灰度,身份、权限和终态规则不能在运行时随意漂移。
- 先从每个活跃 transport 读取 selectedCandidatePairId,再关联本地和远端 candidate 记录。
- 把 candidateType、protocol、relayProtocol 与 networkType 映射成局域网直连、公网直连和中继。
- 路径变化时生成新事件并结束旧区间,不能只在连接成功瞬间采样一次。
路径统计只保留类型、协议、持续时间和粗粒度网络信息即可;让用户看到事实,让运维得到容量依据,但不要把网络身份变成行为画像。
别让错误假设进入生产
失败路径需要与成功路径共享同一套状态模型。只弹一个错误提示却不释放资源、不传播终态,下一次恢复就会继承脏状态。
- 用 candidates 里是否存在 relay 计算 TURN 比例,结果会系统性高估中继使用。
- 忽略多个 transport,数据通道与媒体实际走不同路径时只展示其中一个。
- 把完整 IP、端口和 candidate 字符串送进分析平台,造成不必要的隐私风险。
发布闸门应该检查什么
验证需要先写预期状态轨迹,再执行故障注入。每个阶段同时核对用户可见结果、两端协议状态、持久记录和资源计数,才能证明闭环成立。
- 构造只收集 relay 但最终选 srflx 的连接,确认状态显示公网直连。
- 触发 ICE restart 从直连切到 TURN,再恢复直连,确认区间、时长和 UI 同步更新。
- 在 Chrome、Firefox 和 Safari 的真实统计对象上运行兼容夹具,并拒绝模糊推断。
完成并不等于主路径跑通,而是每个终态都能对账、每个自动动作都受用户意图约束、每个成本都有明确上限。