Reintentar
Este capítulo introduce el mecanismo de reintentos de las solicitudes en Go Resty.
Resty utiliza un retardo exponencial para aumentar el intervalo de reintentos después de cada intento.
Ejemplo de uso:
// Crear un cliente Resty
client := resty.New()
// La configuración del recuento de reintentos se realiza en cada cliente
client.
// Establecer un recuento de reintentos distinto de cero para habilitar los reintentos
SetRetryCount(3).
// Puede personalizar el tiempo de espera inicial para reintentar.
// El valor predeterminado es 100 milisegundos.
SetRetryWaitTime(5 * time.Second).
// También se puede anular MaxWaitTime.
// El valor predeterminado es 2 segundos.
SetRetryMaxWaitTime(20 * time.Second).
// Establecer RetryAfter para calcular la función de devolución de llamada para el tiempo de espera entre reintentos.
// El valor predeterminado (nil) significa utilizar un retardo exponencialmente aumentado y jitter.
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
return 0, errors.New("Cuota excedida")
})
De forma predeterminada, resty reintentará las solicitudes que devuelvan errores diferentes de cero durante la ejecución. Por lo tanto, la configuración anterior hará que resty reintente las solicitudes que devuelvan errores diferentes de cero, aumentando el retardo después de cada intento, con un máximo de 3 reintentos.
También puede proporcionar condiciones de reintentos personalizadas para el cliente:
// Crear un cliente Resty
client := resty.New()
client.AddRetryCondition(
// El tipo RetryConditionFunc se utiliza para las funciones de condición de reintentos
// Entrada: Response no nulo O error de ejecución de solicitud
func(r *resty.Response, err error) bool {
return r.StatusCode() == http.StatusTooManyRequests
},
)
El ejemplo anterior hará que resty reintente las solicitudes que finalicen con el código de estado 429 Too Many Requests
. Es importante tener en cuenta que al especificar condiciones mediante AddRetryCondition
, anulará el comportamiento predeterminado de reintentar al encontrar errores durante el proceso de solicitud. Si desea reintentar como comportamiento predeterminado al encontrar errores durante el proceso de solicitud, debe configurarlo de la siguiente manera:
// Crear un cliente Resty
client := resty.New()
client.AddRetryCondition(
func(r *resty.Response, err error) bool {
// Incluir "err != nil" para simular el comportamiento de reintentar predeterminado al encontrar errores durante el proceso de solicitud.
return err != nil || r.StatusCode() == http.StatusTooManyRequests
},
)
Se pueden agregar múltiples condiciones de reintentos. Es importante tener en cuenta que si se especifican múltiples condiciones, siempre que se cumpla cualquiera de las condiciones, se realizará un reintento.
También puede utilizar resty.Backoff(...)
para implementar escenarios de reintentos arbitrarios.