重试退避是什么
调用模型或外部工具时会遇到瞬时故障:连接重置、服务端 5xx、限流 429。重试策略要回答三件事:哪些错误可以重试、每次等多久、最多试几次。通行做法是只重试可恢复错误,用指数退避加随机抖动打散重试时刻,并同时设置次数上限与总时长上限,防止重试风暴把后端故障放大。
基本信息
| 可重试 | 连接超时、5xx、429 |
|---|---|
| 不可重试 | 参数错误、内容策略拒绝、鉴权失败 |
| 退避公式 | delay = min(base × 2 的 attempt 次方, cap) 再加随机抖动 |
| 上限 | 次数与总时长双上限,常见 3 次与 20 秒 |
| 前提 | 被重试的操作要幂等或可安全重复 |
典型使用场景
- 调用上游模型接口:遇到 429 与 5xx 自动退避重试,减少用户可见失败
- 批量任务执行:单条失败进入重试队列,不阻塞整批
- 工具调用链路:只对连接类错误重试,业务校验失败直接返回
- 跨区域调用:区域抖动时重试后仍失败则切备用端点
- 故障演练:把上游错误率拉高,观察重试是否放大了压力
退避与参数示例
退避与参数示例
可重试: 429、5xx、连接超时
不重试: 参数错误、内容策略拒绝
delay = min(base * 2**attempt, cap) # 指数退避
delay += random(0, jitter) # 抖动防同步重试
最多 3 次;单次调用总时长不超过 20s
超过上限: 记指标并返回可重试提示,不静默吞掉错误类型与处置
| 错误 | 是否重试 | 处置方式 |
|---|---|---|
| 连接超时、连接重置 | 重试 | 退避后重试,注意总时长 |
| 429 限流 | 重试 | 优先按响应里的等待时间退避 |
| 5xx 服务端错误 | 重试 | 有限重试,配合熔断 |
| 4xx 参数与鉴权错误 | 不重试 | 直接返回并修正请求 |
| 内容策略拒绝 | 不重试 | 换策略而非重发同一请求 |
抖动不是可选装饰:不加抖动时大量客户端会在同一时刻重试,退避反而制造周期性尖峰。
重试计数要按上游与错误类型分开统计:所有错误混在一个重试率里,既看不出限流是否变严,也看不出某个接口是否在持续劣化。