スロットリングパターン

英語名 Throttling Pattern
読み方 スロットリング パターン
難易度
所要時間 30分〜1時間
提唱者 クラウドデザインパターン(Microsoft Azure Architecture Center)
目次

ひとことで言うと
#

クライアントからのリクエスト数やリソース消費量に上限を設け、システム全体の安定性とテナント間の公平性を維持するパターン。

押さえておきたい用語
#

押さえておきたい用語
Rate Limiting(レートリミティング)
一定時間内のリクエスト数に上限を設ける制御手法のこと。スロットリングの最も一般的な実装形態。
Token Bucket(トークンバケット)
バケットにトークンを一定速度で補充し、リクエストごとにトークンを消費するレート制限アルゴリズム。バースト許容が特徴。
Sliding Window(スライディングウィンドウ)
固定時間枠ではなく直近N秒間のリクエスト数で判定するアルゴリズムを指す。窓の境界での急増を防げる。
Backpressure(バックプレッシャー)
下流のシステムが過負荷の場合に上流へ処理速度の低下を伝播させる仕組みである。スロットリングと組み合わせて使う。
429 Too Many Requests
HTTPステータスコードでレート制限超過をクライアントに通知するレスポンス。Retry-Afterヘッダーと組み合わせるのが標準的な実装。

スロットリングパターンの全体像
#

スロットリング:3つのアルゴリズムとリクエスト制御の流れ
Clientリクエスト送信API Key / Tenant IDThrottle Layerレート判定カウンター確認制限内 → 通過制限超過 → 429応答Backendリクエスト処理保護されたリソース主要アルゴリズムToken Bucket一定速度でトークン補充リクエスト毎にトークン消費バケット上限までバースト可バースト許容が必要な場合Sliding Window直近N秒間でカウント窓境界の急増を防止メモリ効率がやや低い正確なレート制御が必要な場合Fixed Window固定時間枠でカウント実装が最もシンプル窓境界で2倍バーストの恐れシンプルさ優先の場合
スロットリング設計の進め方フロー
1
制限単位の決定
テナント・API Key・IPなど制限の粒度を決める
2
レート設計
トラフィック分析から上限値を設計
3
アルゴリズム選択
バースト許容度に応じてアルゴリズムを選ぶ
429 + Retry-After
制限超過時のレスポンス設計とクライアント通知

こんな悩みに効く
#

  • 特定テナントの大量リクエストが他テナントのパフォーマンスを低下させる
  • バースト的なアクセスでバックエンドやDBが過負荷になる
  • APIの利用量に応じた課金モデルを実装したいが制御手段がない

基本の使い方
#

スロットリングの粒度を決める
何を単位にレート制限するかを決める。マルチテナントSaaSならテナントID、パブリックAPIならAPIキー、DDoS防御ならIPアドレスが一般的。複数粒度の組み合わせ(テナント全体 + 個別ユーザー)も有効。
トラフィック分析からレート上限を設計する
過去のトラフィックデータからP95・P99のリクエスト量を分析し、正常な利用の上限を特定する。上限は正常利用の 2〜3倍 にマージンを設けるのが安全。プランごとに異なるレートを設ける場合はティア設計も行う。
アルゴリズムを選択し実装する
バースト許容が必要ならToken Bucket、正確な制御が必要ならSliding Window、シンプルさ優先ならFixed Windowを選ぶ。分散環境ではRedis等の共有ストアでカウンターを管理する。

具体例
#

例1:BtoB SaaSがマルチテナントの公平性を確保する

エンジニア30名のBtoB SaaS。テナント 500社 が共有インフラを利用する中、上位 3社 がAPI呼び出しの 60% を占め、他テナントのレスポンスタイムが 2.5秒 に悪化していた。

テナントIDベースのToken Bucketスロットリングを導入。Free/Standard/Enterpriseの3ティアで上限を設定(100/500/2,000 RPM)。制限超過時は429レスポンスとRetry-Afterヘッダーを返す実装とした。

導入後、全テナントのP95レスポンスタイムが 2.5秒 → 180ms に改善。上位3社にはEnterprise契約への移行を提案し、月額ARRが 15% 増加した。

例2:決済APIプロバイダーがDDoS攻撃からシステムを防御する

エンジニア50名の決済APIプロバイダー。月間 2億件 のトランザクションを処理する中、月に 3〜4回 のDDoS攻撃を受け、毎回 15〜30分 のサービス停止が発生していた。

3層スロットリングを構築。CDN層でIPベースのFixed Window(1,000 RPM/IP)、API Gateway層でAPIキーベースのSliding Window、アプリケーション層でテナント別Token Bucketを適用。異常検知で動的にレートを絞る仕組みも追加した。

DDoS攻撃時のサービス停止が ゼロ に。正常トラフィックへの影響もP99レイテンシ 50ms以内 に収まっている。

例3:公共データAPIが急激なアクセス集中を乗り切る

エンジニア8名の自治体向けオープンデータAPI。通常は日 5万リクエスト だが、災害時に 100万リクエスト/時 のアクセスが集中し、サーバーがダウンして情報提供が停止する問題が繰り返されていた。

通常時は 100 RPM/クライアント のFixed Windowで制御しつつ、災害モード時にはCDNキャッシュのTTLを 60秒 に短縮しバックエンドへの到達を減らす二段構えの設計を採用。

災害時のアクセス集中でもサービス稼働率 99.95% を維持。レスポンスタイムは通常時 120ms、災害時でも 350ms に抑えられた。

やりがちな失敗パターン
#

  1. レート上限が厳しすぎる — 正常な利用まで制限してしまうとユーザー体験が悪化する。トラフィック分析に基づき、正常利用の2〜3倍のマージンを設ける
  2. 429レスポンスにRetry-Afterがない — クライアントが即座にリトライして雪崩を起こす。Retry-Afterヘッダーで次にリクエスト可能な時刻を通知する
  3. 分散環境でのカウンター不整合 — 複数インスタンスがローカルカウンターで判定すると、実質的にインスタンス数倍のレートを許容してしまう。Redisなどの共有ストアを使う
  4. レート制限の存在を文書化しない — APIドキュメントにレート上限・429時の挙動・Retry-Afterの意味を明記しないと、クライアント側で適切な対処ができない

まとめ
#

スロットリングパターンは、リクエストレートに上限を設けてシステムの安定性とテナント間の公平性を維持するクラウドデザインパターン。Token Bucket・Sliding Window・Fixed Windowの3つのアルゴリズムから要件に応じて選択し、429レスポンスとRetry-Afterヘッダーでクライアントに適切な再試行を促す。マルチテナント環境での公平性確保とDDoS防御の両面で必須の実装パターン