【ZeroRange WebRTC】Kinesis Video Streams WebRTC 三大平面职责与协同关系总结
Kinesis Video Streams WebRTC 三大平面职责与协同关系总结
基于 amazon-kinesis-video-streams-webrtc-sdk-c-main 源码与 AWS 官方文档
一、为什么必须拆成三个平面?
| 维度 | 控制面(Control Plane) | 数据面 REST(Data Plane REST) | 数据面 WebSocket(Data Plane WebSocket) |
|---|---|---|---|
| 流量特征 | 低频、可缓存、幂等 | 中频、短连接、幂等 | 高频、长连接、有状态 |
| 主要数据 | 通道元数据、终端发现 | 短期凭证、网络配置 | 实时 SDP/ICE 消息 |
| 故障半径 | 影响“新建通道” | 影响“获取配置” | 仅影响“当前会话” |
| 扩缩粒度 | Region 级 | Cell(细胞)级 | Cell + 连接级 |
| 安全模型 | SigV4 + IAM 管理事件 | SigV4 + IAM 数据事件 | 预签名 URL + 连接级 |
拆开后:
- 各平面可 独立发布、限流、扩容、故障演练;
- 权限最小化 + 审计隔离;
- 避免“拿配置 → 建会话 → 再拿配置”的循环依赖;
- 首联通成功率更高(首轮 SDP 即含 TURN)。
二、控制面职责清单
- 资源生命周期
- CreateSignalingChannel / DeleteSignalingChannel
- UpdateSignalingChannel(存储配置、标签)
- 发现与路由
- DescribeSignalingChannel → 拿 ARN、版本、创建时间
- GetSignalingChannelEndpoint → 返回数据面终端(HTTPS/WSS/WEBRTC)
- 枚举与审计
- ListSignalingChannels(支持前缀过滤)
- 配额与限流
- 默认 5–20 TPS/Region;可独立提升
- 缓存友好
- Describe 结果可客户端缓存 5 min;Endpoint 列表变化频率 < 1 h
SDK 映射:
describeChannelLws()@ src/source/Signaling/LwsApiCalls.c:798getChannelEndpointLws()@ src/source/Signaling/LwsApiCalls.c:1039createChannelLws()@ src/source/Signaling/LwsApiCalls.c:850
三、数据面 REST 职责清单
- 短期网络配置下发
- GetIceServerConfig → 返回 24 h 有效期 TURN 用户名/密码/Uris
- 支持 UDP/TCP/TLS 多接入点,按客户端网络自动选优
- 存储会话管理(可选)
- JoinStorageSession → Master 申请录制会话 ARN
- UpdateStorageSession → 修改 MediaType/Retention 等
- 安全与合规
- 密码基于 AWS 签名密钥派生,不落地长期 AK/SK
- 支持
X-Amz-Security-Token临时凭证
- 幂等与缓存
- 相同 ChannelARN+ClientId 重复调用返回一致结果
- 客户端可在 Ttl-30 s 内缓存,减少 90% 调用
- 配额与退避
- 默认 20 TPS(GetIceServerConfig)/ 5 TPS(存储类)
- 指数退避:100 ms → 30 s,时钟偏差 > 5 min 自动校正
SDK 映射:
getIceConfigLws()@ src/source/Signaling/LwsApiCalls.c:1188joinStorageSessionLws()@ src/source/Signaling/LwsApiCalls.c:1570updateStorageSessionLws()@ src/source/Signaling/LwsApiCalls.c:1600
四、数据面 WebSocket 职责清单
- 实时信令交换
- SDP_OFFER / SDP_ANSWER → 一次会话各一次
- ICE_CANDIDATE → Trickle,0~N 条,秒级频率
- 连接生命周期
- ConnectAsMaster / ConnectAsViewer → 预签名 URL 建连
- 单通道 1 Master + N Viewer(默认 10,可调)
- 控制信令
- GO_AWAY → 服务端维护,强制客户端重连
- RECONNECT_ICE_SERVER → 凭证过期,触发客户端重新 GetIceServerConfig
- 保活与重连
- 默认 30 s Ping/Pong;空闲 60 s 服务端主动断连
- SDK 指数退避重连:100 ms → 30 s,支持网络切换/细胞故障迁移
- 消息约束
- 单条 ≤ 10 KiB(Base64 后)
- 支持 CorrelationId 同步等待 STATUS_RESPONSE
SDK 映射:
lwsWssCallbackRoutine()@ src/source/Signaling/LwsApiCalls.c:343- 发送模板 @ src/source/Signaling/LwsApiCalls.h:115-129
五、协同时序(再次浓缩)
六、常见疑问解答
-
“多两次 HTTPS 会不会太慢?”
- Describe 可缓存 5 min;GetIceServerConfig 可缓存到 Ttl-30 s;实际额外 RTT < 1% 会话时间。
-
“为什么不能把 TURN 密码放在 WebSocket 第一条消息?”
- 建 WebSocket 前不知 TURN,对称 NAT 下首连失败率 > 15%;
- 消息体积易超 10 KB;需改 WSS 协议,兼容性难。
-
“控制面返回 503 会影响已建会话吗?”
- 不影响。已建 WebSocket 与媒体流走 Data Plane,与控制面解耦。
-
“细胞故障时如何迁移?”
- GetIceServerConfig 会返回多组 TURN Uris(不同细胞);
- WebSocket 重连时 SDK 随机选端点,自动避开故障细胞。
七、一句话总结
控制面帮你“找到房间并拿到钥匙”,数据面 REST 给你“一次性门禁卡”,数据面 WebSocket 负责“房间里实时对话”;三层正交 → 安全、弹性、可运维全部兼得,表面“多两步”实为“长期最简路径”。
