リトライ

この章では、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(...)を使用して任意のリトライシナリオを実装することもできます。