1

使用 hashcorpgo-retryablehttp库 ( https://github.com/hashicorp/go-retryablehttp )

它会自动重试所有5xx代码:

retryablehttp 在特定条件下执行自动重试。主要是,如果客户端返回错误(连接错误等),或者如果收到500范围的响应码(501除外),则在等待一段时间后调用重试。否则,返回响应并留给调用者解释。

是否有可能重试Request Timeout,例如在408http 状态代码上只是 ootb?
或者我应该构建一些自定义包装器?

4

2 回答 2

2

您可以实现自己的重试策略并将其传递给 Client.CheckRetry 字段。

文件参考:

代码参考:

该代码可能类似于

package main

import (
    "context"
    "net/http"

    "github.com/hashicorp/go-retryablehttp"
)

func main() {

    retryClient := retryablehttp.NewClient()
    retryClient.RetryMax = 10
    retryClient.CheckRetry = func(ctx context.Context, resp *http.Response, err error) (bool, error) {
        ok, e := retryablehttp.DefaultRetryPolicy(ctx, resp, err)
        if !ok && resp.StatusCode == http.StatusRequestTimeout {
            return true, nil 
            // return true for a retry, 
            // if e is nil,
            // you might want to populate that error 
            // to propagate it.
            // see https://github.com/hashicorp/go-retryablehttp/blob/02c1586c8f14be23e7eeb522f1094afbabf45e93/client.go#L673
        }
        return ok, e
    }
}
于 2021-08-03T13:10:10.393 回答
1

正如源代码在文件client.go的第 354 行中指定的那样,您可以配置该CheckRetry函数以在任何自定义场景中重试。

    // CheckRetry specifies the policy for handling retries, and is called
    // after each request. The default policy is DefaultRetryPolicy.
    CheckRetry CheckRetry

您只需编写以下类型的函数并retryablehttp.Client.CheckRetry使用该自定义实现进行配置。

type CheckRetry func(ctx context.Context, resp *http.Response, err error) (bool, error)
于 2021-08-03T13:12:04.990 回答