重试
本章介绍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(...)
来实现任意重试场景。