HTTP-повтор для тайм-аута запроса (408)

Использование hashicorp go-retryablehttpбиблиотека ( https://github.com/hashicorp/go-retryablehttp )

Он автоматически повторяет попытку для всех 5xx код:

retryablehttp выполняет автоматические повторные попытки при определенных условиях. В основном, если клиент возвращает ошибку (ошибки подключения и т. Д.) Или если получен код ответа диапазона 500 (кроме 501), то после периода ожидания выполняется повторная попытка. В противном случае ответ возвращается и предоставляется вызывающей стороне для интерпретации.

Возможно ли, что он повторяет попытку Request Timeout, например, на 408Код статуса http просто ootb?
или я должен создать несколько пользовательских оберток?

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
    }
}

Исходный код указывается в строке 354 в файле client.go, вы можете настроить 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)
Другие вопросы по тегам