← 中文资源

简体中文版本

实现带抖动的指数退避重试

对瞬时故障进行有限次数的指数退避加抖动重试,且只重试可安全重复的操作。

阅读英文原文

概述

只有故障是瞬时的且重试被错开时,重试才有帮助。指数退避控制延迟增长,抖动避免同步风暴,严格的分类则防止重试注定失败的调用。

关键步骤

  1. 分类错误:超时、连接重置、429/503 才重试;400 或校验错误不重试。
  2. 下一次尝试前等待 base 乘以 2 的 attempt 次幂,并叠加抖动。
  3. 限制总次数与总耗时。
  4. 服务端给出 Retry-After 时予以遵循。

验证

  • 瞬时错误会重试至上限。
  • 永久错误立即失败。
  • 重试时序包含随机抖动。
  • Retry-After 头会推迟下一次尝试。

注意事项

  • 依赖不健康时重试反而增加负载,务必与熔断器配合。
  • 分类错误时重试无法解决永久错误,只会推迟失败。

适用范围

本条目围绕「实现带抖动的指数退避重试」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

for (let attempt = 0; ; attempt++) {
  try { return await call(); }
  catch (e) {
    if (!isRetryable(e) || attempt >= 4) throw e;
    await sleep(Math.random() * 100 * 2 ** attempt);
  }
}