レート制限 れーとせいげん
Rate LimitingスロットリングAPIトークンバケット429 Too Many RequestsDoS対策
レート制限について教えて
簡単に言うとこんな感じ!
レート制限は「1分間に何回まで」みたいなルールで、APIへのリクエスト数を制限する仕組みだよ。回転寿司のレーン速度制限みたいなもので、一人が皿を取りすぎると他のお客さんが困るから、ちゃんとルールを決めてるってこと!
レート制限とは
レート制限(Rate Limiting) とは、一定時間内にAPIやサービスへ送れるリクエストの回数を制限する仕組みのことです。「1分間に最大60回まで」「1日に1000回まで」といったルールを設け、それを超えた場合はエラーを返したり、処理を遅延させたりします。
たとえばTwitter(現X)のAPIは「15分間に180リクエストまで」といった制限を設けており、これを超えると 429 Too Many Requests というHTTPステータスコードが返ってきます。ビジネスシステムでAPIを使ったサービスを作る場合、この制限を意識しないと「突然データが取れなくなった」というトラブルにつながります。
レート制限が必要な理由は主に3つです。①サーバーへの過負荷を防ぐ、②DoS攻撃(サービス妨害攻撃) などの悪意あるアクセスをブロックする、③公平にリソースを分配する(一部のユーザーが独占しないようにする)。クラウドサービスや外部APIを利用するシステム開発では必ず押さえておきたい概念です。
レート制限の主なアルゴリズム
レート制限には複数の実装方式があります。それぞれ「どうカウントするか」が異なり、ユースケースによって使い分けられます。
| アルゴリズム | 仕組み | 特徴 |
|---|---|---|
| 固定ウィンドウ | 「1分間に60回」のように固定の時間枠でカウント | シンプル。ウィンドウの境目に集中アクセスされる弱点あり |
| スライディングウィンドウ | 現在時刻から過去1分間をリアルタイムに計算 | 精度が高い。実装は少し複雑 |
| トークンバケット | バケツにトークンが一定速度で溜まり、リクエストごとに消費 | バーストアクセス(急なアクセス増)を許容しやすい |
| リーキーバケット | バケツから一定速度でリクエストが漏れ出る(処理される) | リクエストを均一な速度で処理したい場合に向く |
🪣 トークンバケットのイメージ
[ バケツ ] 最大10トークン
↑ 毎秒1トークン補充
↓ リクエスト1回 = 1トークン消費
✅ トークンあり → リクエスト処理OK
❌ トークンなし → 429エラー or 待機
覚え方:「バケツとトークン」
「トークンバケット」は「コイン(トークン)を貯めて、使う」イメージで覚えると◎。コインが足りないと入場できない遊園地の乗り物みたいなものです。
歴史と背景
- 1990年代〜2000年代初頭:ネットワーク帯域制御の文脈でトークンバケット・リーキーバケットのアルゴリズムが確立。RFC 2697・2698などで標準化
- 2000年代中盤:WebAPIの普及(Twitter・Google Maps等)とともに、APIのレート制限が広く認知される
- 2010年代:クラウドサービスの拡大に伴い、AWSやGCPなどもAPIごとに細かいレート制限を設定。開発者が必ず意識する概念に
- 2015年以降:マイクロサービスアーキテクチャの普及で、サービス間通信にもレート制限が重要に。API Gatewayによる集中管理が一般化
- 現在:CloudflareやAWS WAFなどのエッジサービスがレート制限をインフラレベルで提供。アプリケーション側の実装負担が軽減
レート制限の適用パターンと比較
レート制限は「誰に対して制限するか」によって設計が変わります。
超過時のレスポンス例
HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1712620800
{
"error": "rate_limit_exceeded",
"message": "Too many requests. Please retry after 60 seconds."
}
X-RateLimit-Limit: 上限リクエスト数X-RateLimit-Remaining: 残りリクエスト数X-RateLimit-Reset: 制限がリセットされる時刻(Unixタイムスタンプ)Retry-After: 何秒後に再試行すべきか
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 6585 | HTTPステータスコード 429 Too Many Requests の定義 |
| RFC 2697 | シングルレートトークンバケット(srTCM)アルゴリズムの仕様 |
| RFC 2698 | ツーレートトークンバケット(trTCM)アルゴリズムの仕様 |
| RFC 7231 | HTTPセマンティクス(Retry-Afterヘッダーの定義を含む) |
| RFC 8631 | APIリンクリレーション(RateLimit ヘッダーの議論の背景) |
関連用語
- APIゲートウェイ — APIへのリクエストを一元管理するミドルウェア。レート制限を集中管理する場所
- HTTPステータスコード — サーバーがリクエスト結果を伝える3桁の番号。429はレート制限超過を示す
- スロットリング — レート制限と似た概念。処理速度を意図的に絞ること
- DoS攻撃 — 大量リクエストでサービスを妨害する攻撃。レート制限で緩和できる
- APIキー — API利用者を識別するための認証トークン。ユーザー単位のレート制限に使われる
- マイクロサービス — 小さなサービスを組み合わせるアーキテクチャ。サービス間通信のレート制限が重要
- CDN — コンテンツ配信ネットワーク。エッジでレート制限を適用できるサービスも多い
- REST API — Webで広く使われるAPI設計スタイル。レート制限はREST APIの運用で必須の概念