用語辞典・エラー・運用

429 Too Many Requests

429 Too Many Requestsとは

429 Too Many Requests(フォー・トゥー・ナイン・トゥー・メニー・リクエスツ)は、短時間の要求数が制限を超えたため、処理を一時的に拒否したことを示すステータスです。

頻度制限の結果をクライアントへ伝えます。応答本文で制限条件を説明し、Retry-After ヘッダーで再試行までの待ち時間を示せます。

「一つのIPアドレスから多すぎた」とは限りません。利用者、API鍵、トークン、アカウント、資源、組織、地域、全体処理余力など、サーバーが選んだ単位で数えます。

一定速度で補充される許容量から要求を通す超過分は待機を伝え、クライアントはバックオフと待ち時間のばらつきで再試行を分散する
多数のクライアント要求がトークンバケット型の頻度制限を受け、一部だけサーバーへ通り、上限を超えたクライアントが待機して再試行時刻を分散する様子を示すピクトグラム図解
図1一斉に同じ秒へ再試行すると新しい集中を作ります。待機時間へ乱数待ち時間のばらつきを足して波を崩します。

何を単位に数えるか

利用者単位利用者・アカウント・トークン

共有IPでも利用者を分けやすい一方、認証前の要求には使えません。

クライアント鍵単位API鍵・アプリケーション

契約プランごとの割り当て量を表せますが、鍵漏えい対策が必要です。

ネットワーク単位接続元IP・プレフィックス

簡単ですが、NAT利用者をまとめて制限し、IPv6アドレスの変更へ弱い場合があります。

資源・処理単位接続先・高負荷な操作

重い検索やログインだけを厳しくし、軽いステータス確認と分けられます。

代表的な頻度アルゴリズム

方式考え方注意
固定時間窓一定区間ごとにカウンターをリセット境界の前後で瞬間的に集中しやすい
Sliding 期間直近時間範囲を連続評価精度と保存・計算費用の長所と短所
Token バケットトークンを一定速度で補充し要求ごとに消費平均頻度を守りつつ一定瞬間的な集中を許す
Leaky バケット待ち行列から一定速度で流す待ち時間と待ち行列上限を管理する

クライアントの再試行

  1. Retry-Afterを読む秒数またはHTTP日時として示される待機目安を解釈します。
  2. 要求の再送安全性を確認する同じ操作が二重実行にならない冪等性鍵等を使います。
  3. 指数バックオフを行う連続失敗ほど間隔を広げ、最大待機と試行回数を定めます。
  4. 待ち時間のばらつきを加える多数クライアントが同時に復帰する同時再試行の集中を避けます。

503との使い分け

429は特定クライアント・利用単位が要求数の上限を超えたことを示します。サービス全体が過負荷・メンテナンスで処理不能なら503 Service Unavailableが適します。入口で両方が混ざる場合も、監視では方針超過と処理余力不足を別指標にします。

分散システムでは各処理点のローカルカウンターだけだと総上限を超え、中央カウンターだけだと遅延や単一障害点になります。近似カウンター、区画ごとの割り当て量、最終的な整合性、障害時に要求を許可するか拒否するかを決めます。

要求数の上限は防御と公平性の両方

DoS対策だけでなく、誤った再試行ループ、巡回プログラム、瞬間的なアクセス集中から他利用者の処理余力を守り、契約プランごとの利用枠を公平に分ける目的があります。制限値、残量、リセット時刻の目安をAPI仕様で明示できると、クライアント側で超過を予防できます。

429は要求数の上限の超過を示します。数える主体、時間期間、瞬間的な集中、Retry-Afterを明確にし、クライアントは安全なバックオフと待ち時間のばらつき、サーバーは公平な分散カウンターで再集中を防ぎます。

429とRetry-After:RFC 6585「429 Too Many Requests」

関連用語