指数退避策略通过延迟随重试次数翻倍增长(delay = min(baseDelay×2^attempt, maxDelay))、添加0–50%随机抖动、限制重试次数(2–3次)及仅对临时错误重试,避免重试风暴并提升系统稳定性。

用指数退避策略设置递增延迟,核心是让第 n 次重试前的等待时间随失败次数翻倍增长,同时限制上限、加入随机性,避免所有请求“踩在同一秒”上。
计算延迟时间:按尝试次数动态生成
每次重试前,根据当前重试次数 attempt(从 0 开始计)计算基础延迟:
- 公式为:
delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay) -
baseDelay常取 500 或 1000 毫秒(首次等待时长) -
maxDelay建议设为 30000(30 秒),防止用户无限等待 - 例如 base=1000,三次重试延迟依次为:1000ms → 2000ms → 4000ms
必须加随机抖动:打破重试同步性
纯指数增长仍可能因设备启动时间接近而集体重试,引发“重试风暴”。在基础延迟上叠加随机偏移可有效分散压力:
- 抖动范围推荐:0 到
delay的 25%~50%,例如Math.random() * delay * 0.5 - 最终等待时间 = 基础延迟 + 抖动值
- 代码示意:
const totalDelay = delay + Math.random() * delay * 0.5;
控制重试节奏:结合次数与状态判断
延迟只是手段,关键还要配合合理的重试边界和错误筛选:
- 最大重试次数建议设为 2~3 次(移动端尤其不宜超过 3 次)
- 只对临时性错误重试:网络异常(
TypeError、AbortError)、5xx 状态码、HTTP 0 状态(断连) - 明确跳过 4xx 错误(如 400、401、403、404),它们代表客户端问题或业务拒绝,重试无意义
封装成可复用函数:简洁调用不重复造轮子
把逻辑收拢成一个通用工具函数,便于在 fetch、Axios 或自定义请求中复用:
- 输入:原始请求函数、重试配置(
baseDelay、maxRetries、maxDelay、shouldRetry) - 内部用递归 Promise 实现,每次失败后按策略延迟再执行下一次
- 返回 Promise,成功时 resolve 数据,彻底失败时 reject 最终错误











