代理请求超时预算流程

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