GUIDES

再試行と 429

429・503 を再試行してよいか、どれだけ待つか、いつ諦めるか。指数バックオフの書き方と、再試行してはいけないエラーを整理します。

更新: 2026年10月12日

エラーには、待てば成功するものと、待っても同じ結果になるものがあります。分けて扱います。

再試行してよいもの

コード待つ長さ
429(秒間の上限)1秒を目安に。Retry-After があればそれに従う
429(過負荷)Retry-After に従う
503(準備できていない)数秒から。/health/ready で状態を見てもよい

再試行してはいけないもの

コード理由
400リクエストが不正。直さない限り同じ
401キーが無効。再発行が必要
403プランで使えない。課金されません
402月間の上限。待っても戻らない

書き方(指数バックオフ)

import random, time

RETRY = {429, 503}

def call(fn, tries=5):
    wait = 1.0
    for _ in range(tries):
        r = fn()
        if r.status_code not in RETRY:
            return r
        ra = r.headers.get("Retry-After")
        time.sleep(float(ra) if ra else wait + random.random())
        wait = min(wait * 2, 30)
    return r  # 最後の応答を返し、呼び出し側で判断する
  • 上限を決めます。 無限に再試行すると、障害を悪化させます。
  • ゆらぎ(ジッター)を足します。 多くのクライアントが同時に再試行すると、また同時に 429 になります。
  • 同時実行数を、プランの秒間の上限に合わせます。 並列度を下げるほうが、再試行より確実です(上限と 429)。

上限の順番

401 → 403 → 402 → 429 の順に判定されます。403 は課金されず、402(月間)は 429(秒間)より先に判定されます。

関連:エラー・バッチ処理のしかた

この内容に誤りや不足があれば、お知らせください。