如何測試 HTTP 代理上的 gRPC 串流傳輸

四路 gRPC 資料流穿過透明網際網路閘道並連接分散式服務

一次成功的一元 RPC,不能證明代理能穩定承載長時間 gRPC 串流。gRPC 通常運行於 HTTP/2,生產路徑還必須持續維持 TLS、ALPN、多路複用、流量控制、截止時間、取消與連線狀態。短請求可能正常完成,但伺服器串流暫停、雙向串流出現背壓,或中介設備關閉閒置隧道時才會暴露問題。

以下提供適用於 HTTP CONNECT 或 HTTPS 代理的可重複測試,涵蓋一元、伺服器串流、用戶端串流與雙向串流,並禁止靜默直連回退。只對已授權的服務與代理基礎設施執行。

先拆分傳輸層級

逐層記錄:DNS 解析責任、用戶端到代理的 TCP、代理驗證與 CONNECT 回應、隧道內 TLS、ALPN 是否選擇 h2、HTTP/2 連線與串流,以及最終 gRPC 狀態與 trailers。

不要把所有失敗都稱為「代理逾時」。407 屬於代理驗證;TLS 警示發生在隧道之後、gRPC 之前;UNAVAILABLE 可能是暫時傳輸異常;DEADLINE_EXCEEDED 則可能表示有效串流未在呼叫預算內完成。

若隧道成功但未協商 HTTP/2,請使用代理 ALPN 協商稽核

建立四類可控 RPC

使用確定性測試服務與不含個資的關聯 ID:

  • 一元呼叫:一個請求與一個回應,作為對照;
  • 伺服器串流:一次請求後按固定節奏傳回多則訊息;
  • 用戶端串流:上傳多則訊息後取得一個彙總回應;
  • 雙向串流:用戶端與伺服器依各自節奏並行傳送。

每則訊息記錄序號、傳送與接收時間、位元組數及內容雜湊。加入低於和高於預期閒置門檻的停頓;先測小訊息,再測不超過服務文件限制的受控大訊息。不要使用客戶資料作為測試內容,也不要記錄權杖、代理憑證或完整請求本文。

建立清楚基準

先讓一元呼叫通過代理,確認預期憑證、主機名稱、ALPN、HTTP/2 與 gRPC 狀態。再逐項執行四類呼叫。通過條件是訊息順序、數量和雜湊一致,trailers 完整,且不存在直連。

加入負向對照:錯誤代理憑證必須在代理邊界失敗;不受信任的來源憑證必須失敗關閉;極短截止時間應得到預期結果;取消後應釋放活動串流;阻擋直連時不得繞過代理。

利用代理繞過稽核證明成功結果確實來自指定路徑。

安全測試閒置與保活

代理、負載平衡器或伺服器可能關閉閒置長連線。先不要修改保活參數,插入受控靜默區間,記錄由哪一層關閉。

若業務需要 HTTP/2 PING,應與伺服器及所有中介設備協調間隔與無活動呼叫策略。不要設定激進的用戶端 PING;過量 PING 可能收到 GOAWAY,也不能解決應用層停滯。

健康檢查與保活用途不同:健康 RPC 判斷服務就緒,傳輸 PING 判斷 HTTP/2 連線是否回應。兩者都不能證明業務訊息持續推進,因此仍要保留端到端序號與延遲。

驗證流量控制與背壓

gRPC 流量控制避免快速傳送端壓垮慢速接收端。寫入函式成功,不代表資料已離開程序或抵達對端。

分級降低接收速度,觀察佇列深度、傳送與接收延遲、記憶體、串流視窗和完成時間。正確結果是有界背壓,而非無限緩衝或亂序。

接著在同一 HTTP/2 連線逐步增加並行串流,記錄協商上限、排隊、RST_STREAM 和連線複用。配合HTTP/2 代理連線複用稽核可區分健康多路複用與被迫重連。

記錄關閉與復原

在長串流中一次只引入一種已授權故障:伺服器有序下線、代理隧道關閉、網路中斷、截止時間到期或用戶端取消。分別擷取 GOAWAY、RST_STREAM、TLS 警示、TCP 關閉及最終 gRPC 狀態。

不要自動重播每個中斷呼叫。只有明確為冪等的一元讀取才適合有限重試;用戶端串流與雙向串流可能造成重複副作用,除非應用提供冪等鍵與可復原協定。不得透過換路徑或重試規避速率限制、存取控制或服務端明確拒絕。

其他長連線協定可參考代理 WebSocket 長連線測試

驗收清單

  • 四類 RPC 都使用指定代理,且沒有直連回退;
  • TLS 身分與 ALPN 正確;
  • 兩端訊息順序、數量和雜湊一致;
  • trailers 與最終 gRPC 狀態完整;
  • 已理解閒置行為,未採用激進保活;
  • 流量控制使佇列與記憶體保持在門檻內;
  • 並行串流不超過協商容量;
  • 取消與截止時間可穩定釋放資源;
  • GOAWAY、串流重設與代理驗證失敗能夠區分;
  • 僅重試文件明確允許的安全操作;
  • 記錄不含憑證、權杖與敏感資料;
  • Global、North America、Europe 與 APAC 使用相同測試夾具及驗收視窗。

常見問題

為何一元呼叫成功,串流卻失敗?

一元呼叫可能在閒置計時、流控限制或連線下線事件發生前完成。長串流才會暴露持續 HTTP/2 行為。

應該啟用高頻保活嗎?

不應該。先量測真實閒置行為,再與伺服器和中介設備協調保守設定;高頻 PING 可能被拒絕。

UNAVAILABLE 一定是代理故障嗎?

不一定。應結合 CONNECT、TLS、HTTP/2 frame 與伺服器記錄定位。

失敗的串流可以自動重試嗎?

僅在操作可證明安全時。會變更狀態的串流應使用冪等控制或應用層續傳設計。

合規說明

只測試自有或已獲授權的基礎設施、帳號與服務。遵守服務條款、速率限制、資料保護及地區規範。不得利用代理隱藏禁止活動、規避控制或蒐集受限制資料。

內部參考依據:gRPC 文件《Keepalive》《Status Codes》《Flow Control》與《Default HTTP Proxy Mapper》,查閱日期為 2026 年 9 月 17 日。