一架梯子,一头程序猿,仰望星空!
Go Resty教程 > 内容正文

Go Resty重试机制


重试

本章介绍Go Resty的请求重试机制。

Resty使用backoff在每次重试后增加重试间隔。

使用示例:

// 创建一个Resty客户端
client := resty.New()

// 重试次数配置在每个客户端上
client.
    // 设置非零的重试次数来启用重试
    SetRetryCount(3).
    // 您可以自定义初始重试等待时间。
    // 默认为100毫秒。
    SetRetryWaitTime(5 * time.Second).
    // MaxWaitTime也可以被覆盖。
    // 默认为2秒。
    SetRetryMaxWaitTime(20 * time.Second).
    // 设置RetryAfter以计算重试之间的等待时间的回调函数。
    // 默认值(nil)表示使用指数增加的退避时间和抖动。
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("配额已超过")
    })

默认情况下,resty会在执行过程中重试返回非零错误的请求。因此,上述设置将使resty在每次尝试后递增延迟的情况下重试返回非零错误的请求,最多重试3次。

您还可以为客户端提供自定义重试条件:

// 创建一个Resty客户端
client := resty.New()

client.AddRetryCondition(
    // RetryConditionFunc类型用于重试条件函数
    // 输入:非零Response OR 请求执行错误
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

上面的示例将使resty重试以429 Too Many Requests状态码结束的请求。需要注意的是,当您使用AddRetryCondition指定条件时,它将覆盖默认的重试行为,即在请求过程中遇到错误时进行重试。如果您想要像默认行为一样在请求过程中遇到错误时重试,您需要按如下配置:

// 创建一个Resty客户端
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // 包含"err != nil"模拟在请求过程中遇到错误时的默认重试行为。
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

可以添加多个重试条件。需要注意的是,如果指定了多个条件,只要满足其中任何一个条件,都将进行重试。

还可以使用resty.Backoff(...)来实现任意重试场景。