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)。

二、控制面職責清單

  1. 資源生命週期
  • CreateSignalingChannel / DeleteSignalingChannel
  • UpdateSignalingChannel(存儲配置、標籤)
  1. 發現與路由
  • DescribeSignalingChannel → 拿 ARN、版本、創建時間
  • GetSignalingChannelEndpoint → 返回內容面終端(HTTPS/WSS/WEBRTC)
  1. 枚舉與審計
  • ListSignalingChannels(承受前綴過濾)
  1. 配額與限流
  • 默認 5–20 TPS/Region;可獨立提升
  1. 緩存友好
  • Describe 結果可客户端緩存 5 min;Endpoint 列表變化頻率 < 1 h

SDK 映射:

  • describeChannelLws() @ src/source/Signaling/LwsApiCalls.c:798
  • getChannelEndpointLws() @ src/source/Signaling/LwsApiCalls.c:1039
  • createChannelLws() @ src/source/Signaling/LwsApiCalls.c:850

三、資料面 REST 職責清單

  1. 短期網絡配置下發
  • GetIceServerConfig → 返回 24 h 有效期 TURN 用户名/密碼/Uris
  • 支撐 UDP/TCP/TLS 多接入點,按客户端網絡自動選優
  1. 存儲會話管理(可選)
  • JoinStorageSession → Master 申請錄製會話 ARN
  • UpdateStorageSession → 修改 MediaType/Retention 等
  1. 安全與合規
  • 密碼基於 AWS 簽名密鑰派生,不落地長期 AK/SK
  • 支持 X-Amz-Security-Token 臨時憑證
  1. 冪等與緩存
  • 相同 ChannelARN+ClientId 重複調用返回一致結果
  • 客户端可在 Ttl-30 s 內緩存,減少 90% 調用
  1. 配額與退避
  • 默認 20 TPS(GetIceServerConfig)/ 5 TPS(存儲類)
  • 指數退避:100 ms → 30 s,時鐘偏差 > 5 min 自動校正

SDK 映射:

  • getIceConfigLws() @ src/source/Signaling/LwsApiCalls.c:1188
  • joinStorageSessionLws() @ src/source/Signaling/LwsApiCalls.c:1570
  • updateStorageSessionLws() @ src/source/Signaling/LwsApiCalls.c:1600

四、數據面 WebSocket 職責清單

  1. 實時信令交換
  • SDP_OFFER / SDP_ANSWER → 一次會話各一次
  • ICE_CANDIDATE → Trickle,0~N 條,秒級頻率
  1. 連接生命週期
  • ConnectAsMaster / ConnectAsViewer → 預簽名 URL 建連
  • 單通道 1 Master + N Viewer(默認 10,可調)
  1. 控制信令
  • GO_AWAY → 服務端維護,強制客户端重連
  • RECONNECT_ICE_SERVER → 憑證過期,觸發客户端重新 GetIceServerConfig
  1. 保活與重連
  • 默認 30 s Ping/Pong;空閒 60 s 服務端主動斷連
  • SDK 指數退避重連:100 ms → 30 s,支持網絡切換/細胞故障遷移
  1. 消息約束
  • 單條 ≤ 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<

六、常見疑問解答

  1. “多兩次 HTTPS 會不會太慢?”
  • Describe 可緩存 5 min;GetIceServerConfig 可緩存到 Ttl-30 s;實際額外 RTT < 1% 會話時間。
  1. “為什麼不能把 TURN 密碼放在 WebSocket 第一條消息?”
  • 建 WebSocket 前不知 TURN,對稱 NAT 下首連失敗率 > 15%;
  • 消息體積易超 10 KB;需改 WSS 協議,兼容性難。
  1. “控制面返回 503 會影響已建會話嗎?”
  • 不影響。已建 WebSocket 與媒體流走 Data Plane,與控制面解耦。
  1. “細胞故障時如何遷移?”
  • GetIceServerConfig 會返回多組 TURN Uris(不同細胞);
  • WebSocket 重連時 SDK 隨機選端點,自動避開故障細胞。

七、一句話總結

控制面幫你“找到房間並拿到鑰匙”,數據面 REST給你“一次性門禁卡”,內容面 WebSocket負責“房間裏實時對話”;三層正交 → 安全、彈性、可運維全部兼得,表面“多兩步”實為“長期最簡路徑”。