Ponów próbę

Ten rozdział przedstawia mechanizm ponawiania żądań Go Resty.

Resty używa strategii ponownego próbowania, aby zwiększyć odstęp czasu między ponownymi próbami.

Przykład użycia:

// Utwórz klienta Resty
client := resty.New()

// Konfiguracja liczby ponowień dla każdego klienta
client.
    // Ustaw niezerową liczbę ponowień, aby włączyć ponowienia
    SetRetryCount(3).
    // Możesz dostosować początkowy czas oczekiwania na ponowienie.
    // Domyślnie wynosi 100 milisekund.
    SetRetryWaitTime(5 * time.Second).
    // Można również zastąpić MaxWaitTime.
    // Domyślnie wynosi 2 sekundy.
    SetRetryMaxWaitTime(20 * time.Second).
    // Ustaw RetryAfter, aby obliczyć funkcję zwrotną dla czasu oczekiwania między ponownymi próbami.
    // Domyślna wartość (nil) oznacza stosowanie eksponencjalnie zwiększanego czasu oczekiwania i jittera.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("Przekroczono limit")
    })

Domyślnie Resty będzie ponawiał żądania, które zwracają błędy różne od zera podczas wykonywania. Dlatego powyższe ustawienia spowodują ponowne próby żądań zwracających błędy różne od zera, z zwiększaniem opóźnienia po każdej próbie, do maksymalnie 3 ponowień.

Możesz również dostarczyć niestandardowe warunki ponowienia dla klienta:

// Utwórz klienta Resty
client := resty.New()

client.AddRetryCondition(
    // Typ RetryConditionFunc jest używany do funkcji warunków ponowienia
    // Wejście: niezerowa odpowiedź LUB błąd wykonania żądania
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

Powyższy przykład spowoduje ponowne próby żądań kończących się kodem stanu 429 Too Many Requests. Ważne jest, aby zauważyć, że przy określaniu warunków za pomocą AddRetryCondition zostanie zastąpione domyślne zachowanie ponowienia, które polega na ponawianiu w przypadku napotkania błędów podczas procesu żądania. Jeśli chcesz, aby ponowienia były domyślnym zachowaniem w przypadku napotkania błędów podczas procesu żądania, należy skonfigurować to w następujący sposób:

// Utwórz klienta Resty
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // Dodaj "err != nil", aby symulować domyślne zachowanie ponowienia w przypadku napotkania błędów podczas procesu żądania.
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

Można dodać wiele warunków ponowienia. Ważne jest zauważenie, że jeśli określono wiele warunków, to zawsze, gdy spełniony jest przynajmniej jeden z warunków, zostanie wykonane ponowne próbowanie.

Można również użyć resty.Backoff(...) do implementacji arbitralnych scenariuszy ponowienia.