
一个笼统的“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://www.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 连接与最大时间文档、截止时间和退避抖动可靠性实践。仅列资料名称,不提供外部链接。