Повторная попытка

Эта глава посвящена механизму повторных запросов Go Resty.

Resty использует механизм с увеличением интервала повтора после каждой попытки.

Пример использования:

// Создание клиента Resty
client := resty.New()

// Конфигурация количества повторов для каждого клиента
client.
    // Установите ненулевое количество повторов, чтобы включить повторы
    SetRetryCount(3).
    // Можно настроить начальное время ожидания повтора.
    // По умолчанию 100 миллисекунд.
    SetRetryWaitTime(5 * time.Second).
    // Можно также переопределить MaxWaitTime.
    // По умолчанию 2 секунды.
    SetRetryMaxWaitTime(20 * time.Second).
    // Установить RetryAfter для вычисления функции обратного вызова для времени ожидания между повторами.
    // Значение по умолчанию (nil) означает использование экспоненциально увеличивающегося времени задержки и джиттера.
    SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
        return 0, errors.New("Превышена квота")
    })

По умолчанию resty будет повторять запросы, возвращающие ненулевые ошибки во время выполнения. Поэтому вышеприведенные настройки будут заставлять resty повторять запросы, возвращающие ненулевые ошибки, увеличивая задержку после каждой попытки, до максимума 3 повторов.

Вы также можете предоставить пользовательские условия повтора для клиента:

// Создание клиента Resty
client := resty.New()

client.AddRetryCondition(
    // Тип RetryConditionFunc используется для функций условий повтора
    // Ввод: ненулевой ответ ИЛИ ошибка выполнения запроса
    func(r *resty.Response, err error) bool {
        return r.StatusCode() == http.StatusTooManyRequests
    },
)

В приведенном выше примере resty будет повторять запросы, завершающиеся статусным кодом 429 Too Many Requests. Важно отметить, что при указании условий с помощью AddRetryCondition, это переопределит поведение повтора по умолчанию, которое состоит в повторе при возникновении ошибок в процессе запроса. Если вы хотите выполнить повтор по умолчанию при возникновении ошибок в процессе запроса, необходимо настроить его следующим образом:

// Создание клиента Resty
client := resty.New()

client.AddRetryCondition(
    func(r *resty.Response, err error) bool {
        // Включите "err != nil", чтобы имитировать поведение повтора по умолчанию при возникновении ошибок в процессе запроса.
        return err != nil || r.StatusCode() == http.StatusTooManyRequests
    },
)

Можно добавлять несколько условий повтора. Важно отметить, что если указаны несколько условий, то при срабатывании хотя бы одного из них будет выполнен повтор.

Также можно использовать resty.Backoff(...) для реализации произвольных сценариев повтора.