给接口调用加一层指数退避重试

举报
yd_216508571 发表于 2026/11/04 01:09:07 2026/11/04
【摘要】 联调接口时,偶发的超时、429 或 502 最容易把脚本直接打崩。与其一失败就退出,不如在客户端加一层带上限的指数退避。 只重试该重试的错误网络超时、连接重置、429、502、503 可以重试。参数错误这类 4xx(除 429)重试没有意义,应当立刻失败并打印响应体。 等待时间要涨,还要抖一下每次失败后等待时间按 2 的幂增长,并加上一小段随机抖动,避免多个客户端在同一秒一起重试。同时设最大...

联调接口时,偶发的超时、429 或 502 最容易把脚本直接打崩。与其一失败就退出,不如在客户端加一层带上限的指数退避。

只重试该重试的错误

网络超时、连接重置、429、502、503 可以重试。参数错误这类 4xx(除 429)重试没有意义,应当立刻失败并打印响应体。

等待时间要涨,还要抖一下

每次失败后等待时间按 2 的幂增长,并加上一小段随机抖动,避免多个客户端在同一秒一起重试。同时设最大次数和单次等待上限,防止无限循环。

import random
import time
import requests

def call_with_retry(url, retries=4):
    delay = 0.5
    last = None
    for i in range(retries):
        try:
            resp = requests.get(url, timeout=5)
            if resp.status_code not in (429, 502, 503):
                return resp
            last = resp
        except requests.RequestException as exc:
            last = exc
            if i == retries - 1:
                raise
        time.sleep(delay + random.uniform(0, 0.2))
        delay = min(delay * 2, 8)
    raise RuntimeError("retry exhausted: %s" % last)

使用时注意

  • 写操作先确认接口是否幂等,不幂等的 POST 不要自动重试。
  • 把每次等待时间和状态码写进日志,方便区分限流和服务故障。
  • 这套写法不绑定具体云厂商,本地脚本和定时任务都可以直接套用。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。