Python 脚本的重试设计:什么时候该重试,什么时候必须停

举报
yd_235270612 发表于 2026/10/27 03:25:47 2026/10/27
【摘要】 重试不是再来一次这么简单:先判断幂等性,再区分错误类型,最后才是退避与上限。

重试是自动化脚本里最容易被滥用的能力。很多脚本的第一版都是这样写的:出错就重来,最多三次。看起来稳妥,实际上经常把一次小故障放大成大问题,尤其是操作本身不幂等的时候。


一、先判断这次操作能不能重试


可以重试的典型是"读":查状态、拉列表、取一个资源。失败通常来自网络抖动或服务端瞬时过载,重来一次的代价几乎为零。


不能直接重试的是"写":下单、扣款、提交表单、创建资源。请求超时不代表服务端没执行,盲目重试可能产生两笔订单、两条记录。这类操作要先设计幂等键,或者先查一次"到底成没成"。


二、区分错误类型,别把所有异常都当网络问题


值得重试的:连接超时、连接被重置、502/503/504、限流(429,且响应里给了 Retry-After)。


不该重试的:401/403(凭据或权限问题,重试一万次也一样)、400(参数错了)、404(资源不存在),以及业务层返回的"余额不足"这类确定性失败。把不该重试的错误塞进重试循环,只会让日志更难读,还会拖长故障时间。


三、退避要有上限,也要有抖动


固定间隔重试会让所有客户端在同一秒回来,把刚恢复的服务再打挂。常用做法是指数退避加随机抖动,例如 1 秒、2 秒、4 秒,每次再乘一个 0.5 到 1.5 的随机系数;同时设一个总时长上限,超过就放弃并告警。


重试次数不是越多越好。三次通常够用,超过五次基本说明问题不在抖动,而在配置或依赖。


四、给重试留下证据


每次重试都记一行日志:第几次、什么错误、等了多久。没有这些信息,事后只能看到"失败了",无法判断是重试策略不对,还是依赖真的挂了。


如果脚本要长期无人值守,最好再加一个"连续失败计数":连续多轮都失败时,主动停下来通知人,而不是安静地空转。


一句话总结:重试的价值不在于"多试几次",而在于把偶发故障和确定性故障分开处理。前者值得等一等,后者越早暴露越好。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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