通用面試:如何設計 WebTransport 工作階段生命週期與優雅關閉?
題幹與適用場景
一個即時協作應用需要可靠傳輸文件操作,同時傳送允許遺失的游標位置與心跳。團隊選擇 WebTransport,卻沒有定義連線關閉、網路切換、重連、背壓與資源回收。請設計完整工作階段生命週期,並說明可靠串流、不可可靠資料報與 HTTP/3 連線的邊界。
W3C WebTransport API 同時提供可靠 streams 與不可靠 datagrams;HTTP/3 資料報由 RFC 9297 定義。高品質回答應把應用工作階段與底層傳輸分層,避免把 close() 當作所有訊息已送達的保證。
面試官考察點
- 能否區分工作階段關閉、單一串流關閉、資料報遺失與網路斷線。
- 能否設計重連、工作階段恢復、序號、冪等與狀態快照。
- 能否處理串流背壓、資料報容量、慢用戶端與資源上限。
- 能否定義 close code、reason、逾時與可觀測性。
- 能否在瀏覽器相容性與 HTTP/3 不可用時給出清楚邊界。
回答前需要釐清的問題
- 哪些訊息必須可靠有序,哪些可以遺失或只保留最新值?
- 工作階段是否允許跨網路切換恢復?恢復需要多久和多少歷史操作?
- 伺服器要限制每位使用者的並發工作階段、串流數量與資料報速率嗎?
- 關閉是使用者主動退出、伺服器維護、認證失效還是協定錯誤?
- 瀏覽器和代理是否都支援 WebTransport over HTTP/3?要降級到哪個協定?
30 秒回答框架
把應用 session ID 與底層 WebTransport 連線分開。可靠操作走雙向或單向串流,帶序號和冪等鍵;游標、心跳等短暫狀態走 datagrams,允許遺失。連線異常時保留短期伺服器 session,客戶端指數退避重連並送出最後確認序號,伺服器用快照加增量恢復。主動關閉先停止新訊息、排空可靠串流、送出 close code,再設硬逾時;所有路徑都限制緩衝與資源。
分步驟深入解答
1. 建立應用工作階段與傳輸工作階段
應用 session ID 代表使用者在協作房間的邏輯身分,WebTransport 實例只是一次網路連線。握手完成後伺服器驗證 origin、認證、租戶與權限,建立連線 ID,並映射到應用 session。重連可建立新連線 ID,但不能自動取得他人的 session。
伺服器保存最後確認操作序號、快照版本、訂閱與過期時間。連線遺失後進入短暫 suspended 狀態,超過 TTL 才釋放應用狀態。
2. 為訊息選擇 streams 或 datagrams
文件操作、權限變更與確認訊息走可靠串流;串流內使用明確框架、版本、序號與冪等鍵。游標位置、即時指標與心跳走資料報,接收端按時間戳或版本丟棄舊值。不能把必須送達的業務事件放進資料報。
資料報不保證到達、順序或重傳,大小受路徑和實作限制。應用要量測遺失與延遲,必要時降低頻率或只送最新狀態;可靠串流則依賴 WritableStream 背壓,不無限增加記憶體佇列。
3. 處理背壓與慢用戶端
每條可靠串流設定傳送視窗、待確認上限與最大框架大小。寫入返回 pending 時暫停生產者,逾時則斷線或降級非關鍵訂閱。資料報使用令牌桶和每工作階段配額,丟棄舊游標比阻塞文件操作合理。
伺服器還要限制工作階段數、串流數、並發解碼任務與總記憶體。指標按租戶聚合,避免單一慢用戶端拖垮事件迴圈。
4. 設計斷線與恢復協定
客戶端為每個可靠操作維護本地序號和冪等鍵,收到伺服器確認後推進 checkpoint。重連握手送出 session ID、最後確認序號與用戶端能力;伺服器檢查 session 所屬使用者,再回傳快照、增量或不可恢復錯誤。
恢復期間暫停新的副作用操作,避免舊連線與新連線同時提交。伺服器可用 epoch 讓舊連線寫入失效;恢復完成後再開放生產者。
5. 設計優雅關閉
主動維護時先廣播 draining 狀態,拒絕新工作階段,停止產生非關鍵資料報。可靠串流完成目前框架並送出應用層結束標記,伺服器等待有限時間後呼叫工作階段關閉。瀏覽器 close() 只表達關閉工作階段與錯誤資訊,不能取代應用層確認。
close code 分類應區分正常退出、認證失效、過載、協定錯誤與伺服器維護;reason 使用短且非敏感文字。硬逾時到達後立即釋放連線資源,並記錄未完成操作數。
6. 認證、權限與網路切換
每次建立或恢復連線都重新驗證認證憑證、origin、租戶與房間權限。不能只憑 session ID 恢復。網路切換可能改變位址,應用層透過新連線恢復;伺服器用 epoch 防止舊路徑繼續寫入。
若瀏覽器不支援 WebTransport 或 HTTP/3,降級協定必須明確協商,並重新評估可靠性、延遲與安全邊界。不要把 WebSocket 的關閉語義直接套用到資料報。
7. 觀測與故障演練
記錄連線建立、握手失敗、關閉 code、reason、串流背壓、資料報丟棄、重連次數、恢復耗時與未確認操作數,不記錄 token 或文件敏感內容。指標按用戶端、網路類型與租戶切分。
演練伺服器維護、行動網路切換、代理阻斷 HTTP/3、慢用戶端、資料報突發與重複重連。驗收標準包括無重複副作用、恢復邊界清楚、過期 session 被清理與關閉延遲有上限。
高品質示範回答
我會把應用 session 與 WebTransport 連線分開。可靠文件操作使用帶序號和冪等鍵的 streams;游標與心跳使用可遺失 datagrams。客戶端保存 checkpoint,斷線後指數退避,以新連線攜帶 session ID 和最後確認序號恢復;伺服器驗證使用者與租戶,用快照加增量補齊,並以 epoch 讓舊連線寫入失效。
優雅關閉先 draining,停止新訊息與非關鍵資料報,排空可靠串流後送出應用層結束標記,再用 close code 關閉並設定硬逾時。所有工作階段、串流、緩衝和重連都有上限;監控遺失、背壓、關閉原因和恢復耗時。WebTransport 不可用時明確降級並重新說明能力差異。
常見錯誤
- 把 datagrams 當成可靠訊息,或把
close()當作業務確認。 - 斷線後直接新建連線,不攜帶 checkpoint、epoch 或冪等鍵。
- 無限快取慢用戶端資料,導致記憶體與事件迴圈被拖垮。
- 只按 session ID 恢復,不重新驗證使用者、租戶、origin 與權限。
- 關閉時沒有 draining、硬逾時與未完成操作稽核。
- 忽略 HTTP/3 不可用、代理阻斷與瀏覽器相容性。
- 將完整 token、文件內容或敏感 reason 寫入日誌。
延伸追問與參考答案
哪些資料適合 datagrams?
允許遺失且過期後無價值的資料,例如游標位置、臨時姿態與高頻心跳。必須送達的業務操作走可靠串流。
如何防止重連造成重複操作?
客戶端為操作產生冪等鍵和序號,伺服器按 session 與 epoch 去重,並在確認後推進 checkpoint。
伺服器維護時如何關閉?
先停止新工作階段並廣播 draining,停止非關鍵資料報,排空可靠串流,送出結束標記,再用正常關閉 code 關閉;硬逾時強制回收。
session TTL 過期後客戶端重連怎麼辦?
回傳不可恢復錯誤,要求重新認證和重新加入房間。不能憑舊 session ID 延長權限。
資料報太大或遺失嚴重怎麼辦?
限制單報大小與速率,縮短或合併狀態,只保留最新值;業務事件不能因資料報不可靠而遺失。
如何驗證降級沒有改變語義?
為每種協定聲明可靠性、順序、恢復和認證差異,執行斷線、代理阻斷、慢用戶端與重複重連測試,並監控副作用重複率。