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
五、協同時序(再次濃縮)
ClientControl PlaneData Plane RESTData Plane WebSocket C< DescribeSignalingChannelChannelARNGetSignalingChannelEndpointHTTPS+WSS endpointsGetIceServerConfig (HTTPS)TURN list + credentialsConnectAsMaster/Viewer (WSS)SDP_OFFER / SDP_ANSWER / ICE_CANDIDATE loop [Trickle]RECONNECT_ICE_SERVERGetIceServerConfig alt [credential expired]ClientControl PlaneData Plane RESTData Plane WebSocket C<
六、常見疑問解答
- “多兩次 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負責“房間裏實時對話”;三層正交 → 安全、彈性、可運維全部兼得,表面“多兩步”實為“長期最簡路徑”。