Python API 请求失败重试策略

2次阅读

api请求失败时应区分错误类型(仅重试连接异常、超时及5xx)、采用指数退避+随机抖动(如1s→2s→4s,叠加0.5~1.5抖动因子)、限制重试3~5次及总耗时,并优先用tenacity等成熟库实现。

Python API 请求失败重试策略

API 请求失败时加重试逻辑,不是简单地循环调用,而是要兼顾稳定性、用户体验和后端压力。关键在于区分错误类型、设置合理退避、限制重试次数,并避免雪崩。

区分可重试与不可重试的错误

不是所有失败都该重试。网络超时、502/503/504 等临时性错误适合重试;而 400(参数错误)、401(鉴权失败)、404(资源不存在)或 429(限流)通常不该无脑重试——它们反映的是客户端问题或服务端策略,重复请求只会浪费资源。

  • 推荐只对 连接异常(ConnectionError)、超时(Timeout)、5xx 状态码 启动重试
  • 遇到 429 时可提取 Retry-After 响应头,按其建议延迟后再试
  • 对 401,应优先刷新 Token 而非重试原请求

使用指数退避 + 随机抖动

连续重试会加剧服务压力,尤其在故障期间容易引发“重试风暴”。采用指数退避(Exponential Backoff)能平滑请求节奏,加入随机抖动(Jitter)可进一步分散重试时间点,避免大量客户端同步重试。

  • 基础延迟:1s → 2s → 4s → 8s(每次 ×2)
  • 加入抖动:实际等待 = 基础延迟 × (0.5 ~ 1.5) 的随机因子
  • python 示例(用 time.sleep):
    delay = min(60, (2 ** attempt) * random.uniform(0.5, 1.5))

控制重试边界与熔断意识

无限重试等于拒绝失败,既影响响应时间,也掩盖真实问题。必须设定硬性上限:

立即学习Python免费学习笔记(深入)”;

  • 最大重试次数建议设为 3~5 次http 客户端如 requests 默认 0 次,需手动启用)
  • 总耗时上限(如 30 秒),防止卡死在长延迟链路中
  • 高级场景下可引入熔断器(如 tenacitypydantic 生态的 circuitbreaker),连续失败 N 次后快速失败一段时间

用成熟库简化实现(推荐 tenacity)

手写重试逻辑易出错。tenacity 是 Python 社区广泛使用的重试库,支持条件判断、退避策略、回调钩子等,代码清晰且健壮。

  • 安装:pip install tenacity
  • 基本用法示例:

from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests

@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=1, max=10),
retry=retry_if_exception_type((requests.exceptions.Timeout, requests.exceptions.ConnectionError))
)
def call_api():
return requests.get(“https://api.example.com/data”, timeout=5)

text=ZqhQzanResources