Skip to content

レート制限とバックプレッシャー制御

はじめに

ダブルイレブン(独身の日)の午前0時、数億人のユーザーが一斉に押し寄せる——サーバーは耐えられるか? どんなシステムにも処理能力の上限があります。リクエスト量がシステムのキャパシティを超えたとき、制御しなければ全員が使えなくなります。レート制限とバックプレッシャーは、システムが「押し潰される」のを防ぐ二重の防衛線です。

この記事で学べること

この章を学び終えると、次の能力が身につきます:

  • レート制限の必要性:システムを保護するために一部のリクエストを能動的に拒否する理由を理解
  • レート制限アルゴリズム:トークンバケット、リーキーバケット、スライディングウィンドウの3つのコアアルゴリズムの原理と違いを習得
  • バックプレッシャー機構:上流の速度が下流を超えた場合の処理戦略を理解
  • 多層レート制限:クライアントからゲートウェイ、サービスまでの多層レート制限アーキテクチャを理解
  • 実践力:どのシーンでどのレート制限戦略を選ぶべきかを判断できる
内容コアコンセプト
第1章なぜレート制限が必要か雪崩効果、サービス保護
第2章レート制限アルゴリズムトークンバケット、リーキーバケット、スライディングウィンドウ
第3章バックプレッシャー制御バッファ、廃棄戦略、弾力的なスケーリング
第4章多層レート制限アーキテクチャクライアント、ゲートウェイ、サーバー
第5章実践と選定Nginx、Redis、Sentinel

0. 全景図:なぜユーザーを「拒否」するのか?

これは直感に反するように聞こえます——すべてのユーザーにサービスを提供すべきではないのでしょうか?しかし現実は:一部のリクエストを拒否しなければ、すべてのリクエストが失敗します

100人しか座れないレストランに突然1000人が押し寄せることを想像してください。レート制限しなければ、結果は1000人全員が食事できるわけではなく、厨房が崩壊し、ウェイターが麻痺し、1000人誰も食べられなくなります。正しいやり方は、入り口で列を作って制限し、100人を先に入れて残りは待ってもらうことです。

レート制限のコア目標

  • システム保護:過負荷によるサービスの完全な利用不能を防ぐ
  • 公平な分配:受け入れられたリクエストが正常に処理されることを保証
  • グレースフルデグラデーション:制限されたリクエストには明確な429ステータスコードが返され、タイムアウトや500エラーではない

1. レート制限アルゴリズム:3つの古典的アプローチ

レート制限の核心問題は:単位時間内に、最大何リクエストまで通過を許可するか? 異なるアルゴリズムは精度、バーストトラフィック処理、実装の複雑さにおいてトレードオフがあります。

Rate Limiting Algorithm Comparison
Choose an algorithm, then send requests to observe the effect
Passed0
Rejected0
Tokens left5
Token bucket
Adds tokens to the bucket at a fixed rate. Each request consumes one token, and extra tokens are discarded when the bucket is full. It allows bursts when stored tokens are available.
アルゴリズム原理バーストトラフィック精度実装の複雑さ
トークンバケット固定レートでトークンを追加、リクエストがトークンを消費許可(バケットに在庫あり)
リーキーバケットリクエストをキューに入れ、固定レートで処理不可(完全に平滑化)
スライディングウィンドウウィンドウ内のリクエスト数を統計部分的に許可やや高
固定ウィンドウ時間ウィンドウでカウント境界でバーストの可能性最低

どのアルゴリズムを選ぶか?

  • APIレート制限:トークンバケットが最も一般的で、合理的なバーストトラフィックを許可
  • トラフィックシェーピング:リーキーバケットは一定の出力レートが必要なシーンに適している
  • シンプルなカウント:スライディングウィンドウは実装が簡単で、ほとんどのWebアプリケーションに適している

2. バックプレッシャー制御:上流が下流より速い場合

レート制限は「外部リクエストが多すぎる」問題を解決しますが、バックプレッシャー(Backpressure)は「内部コンポーネントの速度不一致」問題を解決します。

プロデューサーがデータを生成する速度が継続的にコンシューマーの処理速度を上回ると、中間のバッファが膨張し続け、最終的にメモリオーバーフローやデータ損失を引き起こします。バックプレッシャー機構は、コンシューマーが「逆方向に通知」してプロデューサーを減速させる仕組みです。

Backpressure Control
What happens when production is faster than consumption?
Produce rate:6/s
Consume rate:3/s
Producer
6/s
Buffer (0/20)
Running normally
Consumer
3/s
Backpressure strategies:
Drop strategy
Drop new data directly when the buffer is full
Example: log collection, real-time metrics
Blocking strategy
Make producers wait when the buffer is full
Example: Go channels, Java BlockingQueue
Sampling strategy
Process only part of the data and skip the rest
Example: downsampling high-frequency sensor data
Elastic scaling
Dynamically increase the number of consumers
Example: Kubernetes HPA autoscaling

バックプレッシャーの4つの戦略

  1. 廃棄(Drop):バッファが満杯のとき新規データまたは古いデータを廃棄。リアルタイム性が高いが損失を許容できるシーンに適する
  2. ブロック(Block):プロデューサーを一時停止させ、コンシューマーが処理し終えるまで待つ。データ損失が許されないシーンに適する
  3. サンプリング(Sample):一部のデータのみを処理。高頻度データストリームに適する
  4. 弾力的スケーリング(Scale):コンシューマー数を動的に増加。クラウドネイティブ環境に適する

3. 多層レート制限アーキテクチャ

本番環境では、レート制限は一箇所で行えば十分ではなく、多層防御が必要で、各層が異なる粒度の問題を解決します。

位置レート制限の粒度ツール
クライアントフロントエンド/アプリボタンのデバウンス、リクエストのスロットリングlodash.throttle、debounce
CDN/WAFエッジノードIPレベル、地域レベルCloudflare Rate Limiting
APIゲートウェイ入口ゲートウェイルートレベル、ユーザーレベルNginx limit_req、Kong
サーバーアプリケーション内部インターフェースレベル、リソースレベルSentinel、Resilience4j
データベースストレージ層接続数、QPSコネクションプール設定、スロークエリのサーキットブレーカー

レート制限のHTTP仕様

制限されたリクエストは 429 Too Many Requests ステータスコードを返し、レスポンスヘッダーに以下を含めるべきです:

  • Retry-After: クライアントが再試行すべき時間(秒数または日付)
  • X-RateLimit-Limit: レート制限の上限
  • X-RateLimit-Remaining: 残りクォータ
  • X-RateLimit-Reset: クォータリセット時間

4. 実践的な選定

シーン推奨ソリューション説明
Nginx入口レート制限limit_req_zoneリーキーバケットアルゴリズムベース、設定が簡単
分散レート制限Redis + Luaスクリプトトークンバケットまたはスライディングウィンドウ、複数インスタンスでカウント共有
JavaマイクロサービスSentinel / Resilience4jサーキットブレーカー、デグラデーション、ホットスポット制限をサポート
Node.js APIexpress-rate-limitシンプルで使いやすく、Redisストレージをサポート
Goサービスgolang.org/x/time/rate標準ライブラリのトークンバケット実装

まとめ

レート制限とバックプレッシャーは、システムの安定性を守る二つの重要な防衛線です。レート制限は外部トラフィックの流入速度を制御し、バックプレッシャーは内部コンポーネントの処理速度を調整します。

本章の重要ポイントを振り返ります:

  1. レート制限の必要性:一部のリクエストを拒否しなければ、すべてのリクエストが失敗する
  2. 3つのコアアルゴリズム:トークンバケット(バースト許可)、リーキーバケット(完全平滑化)、スライディングウィンドウ(シンプルで正確)
  3. バックプレッシャー機構:廃棄、ブロック、サンプリング、スケーリングの4つの戦略
  4. 多層防御:クライアントからデータベースまで、各層が異なる粒度の問題を解決
  5. 429仕様:レート制限時は標準ステータスコードとレート制限ヘッダー情報を返す

参考資料