Riprova

Questo capitolo introduce il meccanismo di riprova delle richieste Go Resty.

Resty utilizza il backoff per aumentare l'intervallo di riprova dopo ogni tentativo.

Esempio di utilizzo:

// Crea un cliente Resty
client := resty.New()

// La configurazione del conteggio dei tentativi di riprova è su ciascun cliente
client.
    // Imposta un conteggio di riprova diverso da zero per abilitare le riprove
    SetRetryCount(3).
    // È possibile personalizzare il tempo di attesa iniziale della riprova.
    // Il default è 100 millisecondi.
    SetRetryWaitTime(5 * time.Second).
    // È possibile sostituire anche MaxWaitTime.
    // Il default è 2 secondi.
    SetRetryMaxWaitTime(20 * time.Second).
    // Imposta RetryAfter per calcolare la funzione di callback per il tempo di attesa tra le riprove.
    // Il valore predefinito (nil) significa utilizzare un tempo di ritardo aumentato in modo esponenziale e jitter.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("Quota superata")
    })

Per impostazione predefinita, Resty riproverà le richieste che restituiscono errori diversi da zero durante l'esecuzione. Pertanto, le impostazioni sopra renderanno Resty riprovare le richieste che restituiscono errori diversi da zero aumentando il ritardo dopo ogni tentativo, fino a un massimo di 3 riprove.

È inoltre possibile fornire condizioni di riprova personalizzate per il cliente:

// Crea un cliente Resty
client := resty.New()

client.AddRetryCondition(
    // Il tipo RetryConditionFunc viene utilizzato per le funzioni di condizione di riprova
    // Input: Response diversa da zero O errore di esecuzione della richiesta
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

Nell'esempio sopra, Resty riproverà le richieste che terminano con il codice di stato 429 Too Many Requests. È importante notare che quando si specificano le condizioni utilizzando AddRetryCondition, verranno sovrascritte le impostazioni predefinite di riprova, che consistono nel riprovare quando si verificano errori durante il processo di richiesta. Se si desidera riprovare come comportamento predefinito quando si verificano errori durante il processo di richiesta, è necessario configurarlo come segue:

// Crea un cliente Resty
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // Include "err != nil" per simulare il comportamento predefinito di riprova quando si verificano errori durante il processo di richiesta.
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

È possibile aggiungere più condizioni di riprova. È importante notare che se vengono specificate più condizioni, non appena una qualsiasi di esse viene soddisfatta, verrà eseguita una riprova.

È inoltre possibile utilizzare resty.Backoff(...) per implementare scenari di riprova arbitrari.