Tentativa

Este capítulo apresenta o mecanismo de tentativa das solicitações Go Resty.

O Resty usa o backoff para aumentar o intervalo de tentativa após cada tentativa.

Exemplo de uso:

// Crie um cliente Resty
client := resty.New()

// A configuração de contagem de tentativas está em cada cliente
client.
    // Defina uma contagem de tentativas não nula para habilitar as retentativas
    SetRetryCount(3).
    // Você pode personalizar o tempo de espera de tentativa inicial.
    // O padrão é 100 milissegundos.
    SetRetryWaitTime(5 * time.Second).
    // MaxWaitTime também pode ser substituído.
    // O padrão é 2 segundos.
    SetRetryMaxWaitTime(20 * time.Second).
    // Defina RetryAfter para calcular a função de retorno de chamada para o tempo de espera entre as tentativas.
    // O valor padrão (nil) significa usar um tempo de espera exponencialmente aumentado e agitação.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("Cota excedida")
    })

Por padrão, o resty tentará novamente as solicitações que retornem erros não nulos durante a execução. Portanto, as configurações acima farão com que o resty tente novamente as solicitações que retornem erros não nulos, aumentando o atraso após cada tentativa, até um máximo de 3 tentativas.

Você também pode fornecer condições de tentativa personalizadas para o cliente:

// Crie um cliente Resty
client := resty.New()

client.AddRetryCondition(
    // O tipo RetryConditionFunc é usado para funções de condição de tentativa
    // Entrada: Resposta não nula OU erro de execução da solicitação
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

O exemplo acima fará com que o resty tente novamente as solicitações que terminem com o código de status 429 Too Many Requests. É importante observar que, ao especificar condições usando AddRetryCondition, ele substituirá o comportamento de tentativa padrão, que é tentar novamente ao encontrar erros durante o processo de solicitação. Se desejar tentar novamente como comportamento padrão ao encontrar erros durante o processo de solicitação, é necessário configurar da seguinte forma:

// Crie um cliente Resty
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // Inclua "err != nil" para simular o comportamento de tentativa padrão ao encontrar erros durante o processo de solicitação.
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

Várias condições de tentativa podem ser adicionadas. É importante observar que, se forem especificadas várias condições, contanto que qualquer uma das condições seja atendida, uma tentativa será realizada.

Também é possível usar resty.Backoff(...) para implementar cenários de tentativa arbitrários.