
一個籠統的「30 秒逾時」會掩蓋多個階段:DNS、連接代理、TLS、代理驗證、首位元組、回應讀取與重試等待。所有階段共用模糊上限時,故障難以定位,重試還可能在業務截止時間之後繼續產生流量。
可靠方案應先定義一次業務操作的總截止時間,再分配給各階段。
從業務截止時間開始
結帳驗證、搜尋結果收集與夜間資料工作具有不同的最大有效時間。總預算必須包含全部嘗試、退避、排隊與回應處理。
若操作在 20 秒後已無價值,就不能安排三次各 10 秒的嘗試。應保存絕對截止時間,並把剩餘時間傳給每個階段。
拆分階段
DNS 與端點選擇
記錄解析代理主機和選擇 IPv4 或 IPv6 的時間。本機與遠端 DNS 可能不同,快取也需明確策略。
代理連線
連線逾時只涵蓋到代理的 TCP 建連,不應等同整個請求。過短會誤傷跨區域延遲,過長則拖慢故障恢復。
TLS 與驗證
HTTPS 代理與 HTTPS 目的站可能分別建立安全交握,代理驗證也可能增加往返。用戶端支援時應分別記錄。
首位元組
請求送出後,首位元組時間包含代理處理與目的站回應。連線正常但首位元組慢,與無法連線是兩類問題。
回應讀取
大型回應更適合讀取或閒置逾時。只要持續收到有效資料,閒置計時可重設,但總截止時間仍要防止工作無限運行。
使用分位數設定預算
不要只看平均值,應依地區和任務記錄連線、交握、首位元組與總耗時的 p50、p95、p99。接近平均值的逾時會拒絕許多正常請求,遠高於 p99 又會拖慢恢復。
初始值可略高於目標高分位,再持續觀察逾時率、成功率與每個有效結果成本。
只重試可恢復錯誤
短暫連線失敗、部分逾時與某些伺服器錯誤適合重試;憑證無效、政策拒絕、格式錯誤與確定性封鎖通常不應重試。
使用帶抖動的指數退避,並確保等待與下一次請求都能放進剩餘時間。重試前檢查錯誤是否短暫、操作是否可重複、剩餘時間是否足夠,以及切換端點是否真的改變故障條件。
防止重試風暴
大量工作節點同時逾時時,立即重試會進一步壓垮代理和目的站。需要抖動、全域並行限制、目的站速率限制與斷路器。
也要避免多層重試相乘:HTTP 函式庫三次、工作佇列再三次,一個邏輯請求可能成為九次網路嘗試。
Python 共享截止時間範例
import time
import random
import requests
deadline = time.monotonic() + 20
attempt = 0
while attempt < 3:
remaining = deadline - time.monotonic()
if remaining <= 1:
raise TimeoutError("operation deadline exhausted")
connect_timeout = min(4, remaining / 3)
read_timeout = max(1, remaining - connect_timeout)
try:
response = requests.get(
"https://zh-tw.98ip.com/",
proxies={"http": PROXY_URL, "https": PROXY_URL},
timeout=(connect_timeout, read_timeout),
)
response.raise_for_status()
break
except (requests.ConnectTimeout, requests.ReadTimeout):
attempt += 1
delay = min(2 ** attempt + random.random(), deadline - time.monotonic())
if delay <= 0:
raise
time.sleep(delay)
PROXY_URL 應來自受保護機密來源,禁止輸出。正式程式還應分類 HTTP 錯誤、限制回應大小,並輸出脫敏階段指標。
應記錄什麼
記錄任務類型、地區、非敏感端點識別、嘗試次數、連線耗時、首位元組、總耗時、狀態類別、逾時階段與最終結果。不要記錄密碼、驗證標頭、工作階段權杖、Cookie 或含憑證的完整 URL。
正式環境檢查清單
- 一個絕對截止時間涵蓋整個操作。
- 連線、交握、首位元組與讀取階段可區分。
- 預算基於地區分位數。
- 只對短暫且可重複錯誤重試。
- 退避與抖動不超過剩餘時間。
- HTTP 函式庫和佇列重試不會相乘。
- 並行限制與斷路器可防止風暴。
- 日誌依階段記錄且不含憑證。
- IPv4、IPv6、本機與遠端 DNS 路徑均測試。
- 使用符合適用法律、目的條款與資料規則。
需要跨地區與工作進行可控代理測試時,可查看 98IP 的設定資訊。在增加逾時或重試次數前,先測量每個階段。
內部研究依據:Requests 逾時文件、curl 連線與最大時間文件、截止時間和退避抖動可靠性實務。僅列資料名稱,不提供外部連結。