HTTP-повтор для тайм-аута запроса (408)
Использование hashicorp
go-retryablehttp
библиотека ( https://github.com/hashicorp/go-retryablehttp )
Он автоматически повторяет попытку для всех
5xx
код:
retryablehttp выполняет автоматические повторные попытки при определенных условиях. В основном, если клиент возвращает ошибку (ошибки подключения и т. Д.) Или если получен код ответа диапазона 500 (кроме 501), то после периода ожидания выполняется повторная попытка. В противном случае ответ возвращается и предоставляется вызывающей стороне для интерпретации.
Возможно ли, что он повторяет попытку
Request Timeout
, например, на
408
Код статуса http просто ootb?
или я должен создать несколько пользовательских оберток?
2 ответа
Вы можете реализовать свою собственную политику повтора и передать ее в поле Client.CheckRetry.
Ссылка на документ:
- https://pkg.go.dev/github.com/hashicorp/go-retryablehttp?utm_source=godoc#Client
- https://pkg.go.dev/github.com/hashicorp/go-retryablehttp?utm_source=godoc#DefaultRetryPolicy
Ссылка на код:
- https://github.com/hashicorp/go-retryablehttp/blob/02c1586c8f14be23e7eeb522f1094afbabf45e93/client.go#L401
- https://github.com/hashicorp/go-retryablehttp/blob/02c1586c8f14be23e7eeb522f1094afbabf45e93/client.go#L424
Код может выглядеть примерно так:
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)