
2026/01/15 1:29
**HTTP レートリミットヘッダーセット** | ヘッダー | 説明 | |--------|-------------| | **X‑RateLimit-Limit** | 現在の期間で許可される最大リクエスト数。 | | **X‑RateLimit-Remaining** | リミットに達する前に残っているリクエスト数。 | | **X‑RateLimit-Reset** | レートリミットウィンドウがリセットされる Unix タイムスタンプ(秒単位)。 | *ヒント:* これらのヘッダーを利用してクライアント側でリクエスト頻度を監視・調整し、レート制限を課す API とスムーズに連携できるようにしましょう。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改訂版まとめ
本草案は、サーバーがレートリミット規則と実行時状態を公開し、クライアントが「429 Too Many Requests」を回避できるようにするための新しい HTTP ヘッダー ―
RateLimit‑Policy と RateLimit を提案しています。
-
はポリシー設定を列挙します:RateLimit-Policy
(ポリシー識別子)name
(パーティションキー)― クライアント固有のキーで、クライアントごとの状態にマッピングされますpk
(quota)― ウィンドウ内の最大リクエスト数q
(window width, 秒単位)w
(quota units:qu
、"requests"
、または"content‑bytes"
)。"concurrent‑requests"
-
はポリシーブロックごとの実行時状態を報告します:RateLimit
とname
はポリシーヘッダーと一致します;pk
= 次の期間で使用できる残りクォータ;r
= そのt
リクエストが送信可能な有効ウィンドウ(秒単位)。r
複数のポリシーブロックは単一応答内に現れることがあります。
アルゴリズムは線形 GCRA(Generic Cell Rate Algorithm)リミッターです:各クライアントについて「not‑before」タイムスタンプを保持し、区間
[now-w, now] にクリップし、リクエストごとに interval * cost を追加します。リクエストは now > time のみ許可されます。残りクォータ r と次ウィンドウ t は (now – time) から導出されます。拒否された場合、r = 0 であり、t はクリップが失効するまでの残り時間に設定されます。
改良点には、レートが上限を下回るまでブロックするより厳格な拒否ルール、クリップ上限を延長するオプションのペナルティタイムアウト、およびアイドルクライアント状態の定期的なクリーンアップが含まれます。
線形リミッターはバースト後に有効ウィンドウを縮小してブーストトラフィックを平滑化します。これは、繰り返しバーストを許容するスライディングウィンドウ方式とは対照的です。指数リミッターもこれらのヘッダーで表現できます(計算は線形手法の逆数にすぎません)。草案は、この単純な GCRA アプローチが実装しやすく、効率的なクライアントごとの状態管理を要求する一方で、任意のクォータまたはクライアント行動記述に十分柔軟であると主張しています。
本文
Rate‑Limit ヘッダー草案 – 概要と線形アルゴリズム
IETF の草案では、次の 2 つのヘッダーを定義しています。
| Header | 用途 |
|---|---|
| RateLimit-Policy | サーバーが要求に対して選択したレート制限アルゴリズムの入力パラメータを記述します。パラメータは以下です。 • – ポリシー名• – パーティションキー(クライアントごとの状態を識別)• – クォータ(ウィンドウ内の最大単位数)• – ウィンドウ(秒単位の時間幅)• – クォータ単位 (, , …) |
| RateLimit | このリクエストに適用されたポリシーと結果として得られた状態を報告します。フィールドは以下です。 • – ポリシー名• – パーティションキー• – 利用可能なクォータ(残りの単位数)• – 有効ウィンドウ(次に許可されるバーストまでの秒数) |
両ヘッダーとも複数の名前付きポリシーを列挙できる構造になっています。
クライアント側の振舞い
ポリシーを守るには、クライアントは任意の
w 秒間に q 回以上リクエストを送らないようにしなければなりません。RateLimit ヘッダーを受信した際には、次の
t 秒間で r 以上のリクエストを発行してはならないという指示です(草案では「remaining quota」と「reset time」と呼ばれますが、「現在のクォータ」と「ウィンドウ」の概念として理解する方が適切です)。
最大持続レート
rate = q / w // 単位あたり秒数 interval = 1 / rate = w / q // リクエスト間の平均インターバル
草案では以下のクォータ単位が標準化されています。
| 意味 | コスト |
|---|---|---|
| 1 回リクエスト | 1 |
| コンテンツサイズ | サイズ(バイト) |
| 本記事では使用しない |
パーティションキー (
pk) はサーバーが保持するクライアントごとの状態を指します。典型的には、サーバーは少数の静的ポリシーと多数の動的クライアント状態を持ちます。
線形レート制限アルゴリズム(GCRA 変種)
これはトークンバケット / リーキーバケット実装を草案用語で表現した単純なモデルです。
クライアントごとの状態は not‑before タイムスタンプ (
time) のみで構成されます。
コアアルゴリズム
# 現在の状態取得;新規クライアントは過去に設定 time = state[pk] or 0 # スライディングウィンドウ内にタイムを収める(バーストサイズと悪意あるペナルティ防止) time = clamp(now - w, time, now) # このリクエスト分の時間を消費 time += interval * cost # 「requests」なら cost は 1 if now > time: # 許可されるケース state[pk] = time d = now - time r = floor(d * rate) # 残りクォータ(整数) t = ceil(d) # 有効ウィンドウ(秒) return ALLOW(r, t) # 許可されないケース – 時間が残っていない r = 0 t = ceil(time - now) return DENY(r, t)
clamp(a,b,c) は b を [a, c] の範囲に収めます。アルゴリズムは整数の
r と t を返すため、クライアントには実際のキャパシティよりも保守的な(少し小さい)見積もりが提供されます。
任意の改良
| シナリオ | 修正 |
|---|---|
| クライアントを遅くするまですべて拒否 | に を追加して を算出 |
| 早期リクエストに対する追加ペナルティタイムアウト | の上限を将来へ伸ばす |
バックグラウンドのクリーンアップ
定期的にアイドル状態のクライアントを削除します。
for pk, time in state: if time < now - w: delete state[pk]
他のレートリミッター
| アルゴリズム | 特徴 |
|---|---|
| Token/Leaky Bucket | GCRA と同等に実装でき、トークンカウンタを使用 |
| Sliding‑Window Log | 最近のリクエストタイムスタンプを保持;コストが高く、バースト性が残る |
| Exponential Backoff | 平均レートを直接測定し、線形アルゴリズムの逆数(同様の平滑化効果)で / を算出 |
線形リミッターはクライアントがバーストすると自動的に有効ウィンドウが縮小され、よりスムーズなトラフィックを実現します。他のアルゴリズムでも同様の滑らかさを得ることは可能ですが、通常は実装コストが高くなります。
まとめ
草案で定義された RateLimit ヘッダーは 任意 のレート制限アルゴリズムと併用できます。
簡易的な GCRA スタイルの線形リミッターは実装が容易、空間効率も高く、クライアントに必要なガイダンス(
r, t)を提供しつつ周期的なバースト–ポーズ振舞いを強制することなく運用できます。