for i in range(5):
    r = requests.get(url, timeout=8)
    if r.status_code < 500: break
    time.sleep((2 ** i) + random.random())

目标站维护期间返回 503,脚本的 5 次重试在 300 毫秒内跑完,随后接口开始返回 403 并提示账号封禁 24 小时。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,重试没有间隔,短时间内把失败次数打满,触发了账号级的风控封禁。503 本身表示服务端暂时不可用,立刻重试只会加重对方负载。

「抓取重试退避」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:只对 5xx 和超时两类错误重试;间隔按 2、4、8 秒指数增长;每次加 0 到 1 秒的随机抖动;超过 5 次直接失败并发告警。

改完只确认一件事:同样的维护窗口内重试都落在 5 次以内,账号没有被封,服务恢复后 2 分钟内任务跑完。

作者 9823189