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(秒間)より先に判定されます。
この内容に誤りや不足があれば、お知らせください。