Playwright Keep-Alive 開放問題:避免代理 API 測試因通訊端重複使用而重設

Microsoft Playwright 儲存庫在 2026 年 9 月 13 日出現新的開放 Issue。報告者指出,APIRequestContext 在接近伺服器宣告的 Keep-Alive 逾時邊界重複使用 HTTP 通訊端時,可能拋出 ECONNRESET。報告中的並行讀取測試在約六秒邊界重現失敗,而瀏覽器導覽未顯示相同症狀;報告者認為 Chromium 重試了已重複使用通訊端的失敗。
這仍是使用者提交的開放問題,不是維護者已確認的缺陷,也沒有正式發布的修正。報告環境為 Playwright 1.58.2、Node 26.3.0、macOS arm64 及 Next.js 開發伺服器。團隊不能把所有連線重設都歸因於它,但可以藉此檢查閒置邊界、保留失敗階段,並確保代理環境的重試不會產生重複副作用。
內部研究來源:Microsoft Playwright 儲存庫,Issue 42698,《APIRequestContext ignores the server's Keep-Alive timeout, producing ECONNRESET on socket reuse》,2026 年 9 月 13 日建立。
為何代理讓歸因更困難
代理請求可能同時有多層可重複使用連線:客戶端到 HTTP 代理、CONNECT 通道內的目標 TLS,以及目標伺服器的 Keep-Alive 政策。SOCKS5 還會增加閘道與 DNS 路徑。
若只記成「代理錯誤」,便無法判斷重設發生於客戶端到閘道、通道、目標連線或應用回應。並行可能擴大時間競爭窗口,但不一定是根因。
使用自有測試夾具重現
使用你控制、會宣告較短 Keep-Alive 逾時的伺服器,在回應加入隨機挑戰與伺服器端請求編號。直連與代理測試維持相同 Playwright、Node、請求內容及逾時。
記錄測試編號、路由別名、方法、冪等鍵雜湊、連線序號、請求前閒置毫秒、代理工作階段、回應挑戰、伺服器請求編號雜湊、錯誤碼、失敗階段與重試次數。不得保存代理密碼、Cookie、授權標頭或原始冪等鍵。
在逾時點前後密集取樣。若伺服器約六秒關閉,可測試 4.5、5.0、5.5、5.9、6.0、6.1、6.5 及 7.0 秒。先用單一工作執行緒,再使用受控小並行,每個區間重複數次。
分開直連、代理與瀏覽器對照
| 對照 | 目的 |
|---|---|
| 直連 APIRequestContext | 確認不經代理是否也重設 |
| 代理 APIRequestContext | 測量閘道與通道影響 |
| 瀏覽器導覽 | 檢查瀏覽器重試是否遮蔽問題 |
| 新請求內容 | 比較新連線池與重複使用通訊端 |
| 關閉重複使用對照 | 驗證避免重複使用是否改變症狀 |
不要在混合瀏覽器及 API 的內容中直接全域設定 Connection: close,否則可能連正常頁面與靜態資源的連線也一併關閉。
只在操作安全時重試
Issue 報告者建議只對 ECONNRESET 的冪等請求重試,並刻意排除 POST,因為伺服器可能已完成建立,只是客戶端讀取回應時被重設。對資料蒐集、註冊與帳戶流程,這項區別很重要。
- 唯讀 GET 通常可在上限內重試;
- PUT、PATCH、DELETE 僅在伺服器強制冪等且能查詢結果時安全;
- POST、下單、註冊、發訊息預設不可盲目重放;
- 驗證、權限與政策錯誤應立即停止。
即使方法名稱通常視為冪等,也可能觸發業務副作用,因此要在自有伺服器驗證實際行為。
使用結果帳本
重試寫入操作前,保存雜湊後的操作識別並查詢伺服器結果。帳本應區分未發送、已發送但未看到回應、伺服器已接受、伺服器拒絕、重複已阻止,以及最終結果未知。
結果未知時應進入對帳,而不是直接重放,才能避免讀取側重設造成重複記錄或訂單。
分開驗證代理工作階段
重試可能重複使用原代理連線、建立新通道,或取得新的輪換出口,必須記錄。若目標把狀態綁定來源 IP,即使 HTTP 方法安全,更換出口也可能改變結果。
使用住宅代理工作階段固定性測試驗證路由身分,以代理連線池指南定義連線池邊界,並讓重試負載保持在代理並行飽和測試得出的安全容量內。
不要誤判故障層
發生重設時,依序確認通訊端為新建或重複使用、閒置時間與伺服器逾時的關係、伺服器是否收到並完成操作;接著分別直連、建立新請求內容、比較瀏覽器和 API 行為,並在不改變目標時更換閘道。日誌僅保留必要的客戶端與伺服器時間點。
不要擷取第三方流量。若確需更深入的封包證據,應在獲批實驗環境執行並最小化負載留存。
上線檢查清單
- 明確標示此資訊為開放報告,不是正式修正說明;
- 完成直連和代理的閒置邊界測試;
- 可區分新通訊端與重複使用通訊端;
- 伺服器接收記錄能關聯客戶端結果;
- 每類重試操作都有安全分類;
- 寫入重試具備冪等及對帳;
- 重試次數與總耗時有上限;
- 已記錄代理工作階段是否變化;
- 日誌不含憑據或個人資料;
- 已驗證回復或連線池緩解方案。
常見問題
每個 ECONNRESET 都是這個問題嗎?
不是。閘道、目標、區域網路、TLS 關閉和應用程序都可能重設連線,必須先重現閒置邊界才能歸因。
所有重設都能重試一次嗎?
不能。寫入操作可能已成功,只有證明安全或具備伺服器冪等與對帳時才能重試。
為何瀏覽器導覽可能正常?
報告者稱其測試中 Chromium 重試了通訊端失敗,而 APIRequestContext 顯示錯誤。必須在自己的版本和環境中驗證。
關閉 Keep-Alive 是永久修正嗎?
它可以是診斷或暫時緩解,但會增加連線成本,廣泛套用也可能影響瀏覽器資源載入。上線前應測量範圍及代價。
合規說明
只在自有或明確獲准的系統與代理路由上重現。遵守平台規則、合約、速率限制與隱私要求。沒有明確冪等保護和結果對帳時,不得自動重試付款、註冊等具有實際後果的操作。