给接口调用加一层指数退避重试
【摘要】 联调接口时,偶发的超时、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)