← 中文资源

简体中文版本

Got 指数退避重试配置

为 got 客户端配置指数退避重试:限定方法与状态码白名单、封顶延迟,并在每次重试前输出钩子日志。

阅读英文原文

示例说明

该示例解决盲目重试的问题。对 GET 这类幂等请求,网络抖动或网关 502 属于瞬态故障,值得自动重试;而 4xx 业务错误重试只会放大故障。got 的 retry 选项可以把重试范围精确限定在可重试的方法、状态码与错误码上,并用 calculateDelay 封顶退避时间。

技术要点

  • methods 限定只重试幂等的 GET 请求
  • statusCodes 白名单区分瞬态与永久故障
  • calculateDelay 给指数退避设置 8 秒上限

代码解读

代码用 got.extend 创建复用配置的客户端实例:limit 控制 总次数,beforeRetry 钩子在每次重试前打印目标 URL 与第几次尝试,方便定位下游抖动。request 超时独立于重试,保证单次尝试不会无限等待,最终 json() 直接返回解析后的对象。

使用建议

非幂等的 POST 默认不应自动重试,除非服务端实现了幂等键。calculateDelay 的封顶值要与调用方的整体超时预算匹配,避免重试链路超过上游容忍时间。生产环境建议把重试日志接入统一日志管道。

代码示例

import got from 'got';

const client = got.extend({
  retry: {
    limit: 4,
    methods: ['GET'],
    statusCodes: [408, 429, 500, 502, 503, 504],
    calculateDelay: ({ computedValue }) => Math.min(computedValue, 8000),
    errorCodes: ['ETIMEDOUT', 'ECONNRESET', 'ECONNREFUSED'],
  },
  timeout: { request: 10_000 },
  hooks: {
    beforeRetry: [
      ({ attemptCount, url }) => {
        console.log('retrying', url.href, 'attempt', attemptCount);
      },
    ],
  },
});

const body = await client('https://api.example.com/orders').json();