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.