重试风暴 · 退避与抖动
Agent 一轮要调几十次 API,429 限流必然成批出现。失败后怎么重试?三个客户端同时被拒、同时重拨,服务刚喘口气又被砸回去。切三种策略重放同一场风暴:固定间隔永远满载、指数退避摊薄了频率但整点扎堆、加了抖动才真正散成细雨。
纯前端事件驱动模拟:50 客户端、服务 2s 恢复、每 0.25s 容量 10 个,带种子可复现;错误分流规则(429 只等不换 / 529 到顶换 fallback / 4xx 直接抛)与知识库《调用层》逐条对齐,零 API。
服务过载,50 个客户端在 t=0 同时被拒(429),各自安排重试。 服务 t=2s 恢复,之后每 0.25s 只能处理 10 个请求—— 切三种重试策略,看谁把重砸变成细雨。
重试时间轴(每行一个客户端)
被拒(再吃 429) 成功
到达冲击:每 0.25s 窗口涌入的请求数(峰值 50 个,容量 10 个/窗)
10s 内完成
50/50
最后成功 6.0s
恢复后仍被拒
100
次——扎堆二次雪崩
峰值冲击
50
个/0.25s 窗(容量 10)
固定间隔保护不了任何人:所有人每秒整点同砸,服务恢复后仍被成批拒掉——它自己被重试打满了,永远喘不过气。
调用层的错误分流(本文另一半)
429 / 529 / 超时断流可重试:retryAfter 优先 → 指数退避 → 最多 N 次
529 到顶换 fallback 模型兜底——服务过载谁打都不通;429 只等不换(限的是你自己的配额,换线绕不开)
4xx 参数 / 鉴权不可重试:重试没有意义,立刻抛给人修