APIから429 Too Many Requestsが返ってきたとき、同じ要求をすぐ送り直すと、制限された理由を自分で増やしてしまうことがあります。一方、指定された時間だけ待てば、次は必ず成功するという意味でもありません。HTTPのRetry-Afterが伝える待ち時間と、再送してよいかという判断を分けると、回復処理を組み立てやすくなります。
簡単にまとめると?
- 429は、一定時間内の要求が多すぎることを表します。誰を単位に、どの範囲を数えるかまでは、この番号だけでは分かりません。
- Retry-Afterは、応答を受け取ってから待つ秒数、またはHTTP形式の日時を伝えます。429への付与は任意なので、ない場合もあります。
- 待機期限と、再送による二重処理の防止は別々に確認します。待ち終わったことは、成功や再送の安全性の保証ではありません。
429から分かること、分からないこと
RFC 6585で定義される429は、利用者が一定の時間内に送り過ぎた要求を制限する、レート制限の状態を表します。ただし、その利用者をどう識別するか、要求をどの範囲で数えるかは固定されていません。認証情報などで利用者を区別し、一つの対象、サーバー全体、複数のサーバーをまたぐ範囲などで数える設計があり得ます。
このため、あるAPIへの429を見て、同じ認証情報を使う別の処理が無関係だと決めつけることはできません。逆に、すべての処理を一律に止める必要があるとも限りません。応答本文や、そのサービスの仕様から制限の単位を確認することが先になります。RFCは、応答内容に状態の説明を含めることを推奨しています。
また、429にRetry-Afterを付けることは可能ですが、必須ではありません。ヘッダーがなければ「待ち時間ゼロ」とは解釈せず、サービスが定めた再試行規則や、実装側の回数・時間の上限へ戻ります。RFC 6585では429の応答をキャッシュに保存してはならないとも定めています。通常の応答キャッシュと、クライアント内部で待機期限を記録する制御は分けて考えます。
秒数と日時では、待ち時間の求め方が違う
RFC 9110のRetry-Afterには二つの形式があります。Retry-After: 120なら、応答を受け取ってから120秒待つ指定です。数値は、秒を表す0以上の十進整数です。日時形式なら、たとえばRetry-After: Fri, 23 Oct 2026 01:02:00 GMTのように、待機先の日時が示されます。
説明用に、応答を受け取った日時を2026年10月23日1時0分30秒GMTとします。秒数120なら待機先は1時2分30秒です。同じ受信時点に、日時形式で1時2分0秒が示されていたら、差は90秒になります。ここでGMTの表示を日本時間として読み替えると9時間ずれるため、タイムゾーンを含めて解釈する必要があります。

日時形式では、受信側の時計のずれが差分に影響します。過去の日時、壊れた値、非常に長い待ち時間をどう扱うかは、サービスの規則と処理全体の締切を踏まえて決めます。たとえば、全体の残り時間が60秒しかないのに90秒の待機が必要なら、その処理の中で再送する余裕はありません。「制限を無視して60秒後に送る」こととは区別し、後続の実行へ延期するか、回復できない結果として返す設計になります。
みんなが同時に再開すると、再び集中する
待ち時間を守るだけでも、即座の再送より要求の集中を抑えられます。しかし、同じ時刻に失敗した多数のクライアントが同じ秒数を待てば、再開時刻もそろいます。これは、待機が正しいかと、再開が分散されるかが別であることを示します。
ここから先はHTTP仕様が一律に定めるアルゴリズムではなく、実装上の選択です。たとえば、サービスが示す待機を短縮しない範囲で追加の小さな遅延をばらつかせる方法や、繰り返す失敗に応じて待ちを延ばす方法が考えられます。追加遅延はジッターと呼ばれます。いずれも、試行回数、待機の上限、処理全体の締切を決めておかないと、利用者に結果を返せないまま処理を続けてしまいます。
たとえば120秒の待機指示に対して、三つの処理が追加で0秒・2秒・5秒待つ設計なら、再開候補は受信後120秒・122秒・125秒です。これは集中をずらす考え方の例であり、推奨する固定値や、制限を確実に解除する処方ではありません。共有する制限枠やサービスの負荷が変われば、再び429になる可能性があります。
待ってよいことと、同じ操作を送り直してよいこと
再試行では、待ち時間だけでなく、元の操作の性質を見ます。同じ要求を繰り返したとき、意図したサーバー側の効果が一回と同じである性質を、冪等性(べきとうせい)と呼びます。RFC 9110は、応答を読む前に通信が途切れた場合などの再試行で、この性質を区別しています。
たとえば情報を取得するGETと、新しい処理を作るためのPOSTを、同じ再送規則へ無条件にまとめることはできません。特に応答が一切受け取れなかった場合、処理が適用されなかったのか、適用後に応答だけ失われたのかは別問題です。待つ時間を延ばしても、この不確実性はなくなりません。
RFC 9110は、非冪等なメソッドを自動再送する場合、実際の意味が冪等であると分かる仕組みや、元の要求が適用されていないと分かる手段が必要だとしています。サービスが提供する重複防止の仕組みや、処理結果を照会できる識別子は、そのサービスの仕様に沿って利用します。単に独自の識別子を付ければ、相手が重複を防いでくれるわけではありません。
実装では三つの判断を分けて記録する
最初は「制限の対象」です。どの認証情報や要求範囲が制限されているかを調べ、共有する処理にも待機を反映する必要があるかを判断します。次は「待機先」です。秒数と日時を正しく読み、受信時点や締切と対応付けます。最後は「再送の可否」です。対象の操作を重ねてもよいか、前の結果を確認する必要があるかを決めます。
この三つを分ければ、待機期限を過ぎても送り直さない理由や、別の独立した処理は続けられる理由を説明できます。Retry-Afterは、いつ次の要求を考えるかを助ける情報です。どの要求を、何回まで、どの条件で繰り返すかは、それと合わせて設計する必要があります。
出典・参考資料
- RFC 6585 — Additional HTTP Status Codes(2012年4月)、第4節:429の意味、識別・計数範囲、Retry-Afterの任意性、キャッシュの扱い。
- RFC 9110 — HTTP Semantics(2022年6月)、第10.2.3節:Retry-Afterの二つの形式、第9.2.2節:冪等性と再試行。待機時間の数値例と追加遅延の例は、本稿の説明用条件で計算。










