レート制限とクォータ
レート制限とクォータは、CPU、ネットワーク、データベース、キュー、外部APIなど、共有リソースの需要を管理するための基本的なメカニズムです。目標は公平性、SLOの予測可能性、そして爆発、虐待、そして「騒々しい隣人」からの保護です。
1)基本的な概念
Rate limit-リクエスト/操作の強度(req/s、 msg/min、 bytes/sec)を制限します。
バースト-平均レートを超える許容短期バースト。
クォータ-タイムウィンドウ(ドキュメント/日、GB/月)ごとのボリュームリミット。
並行キャップ-同時操作(同時リクエスト/ジョブ)の制限。
スコープ-スコープ:テナントごと、ユーザーごと、トークンごと、エンドポイントごと、IPごと、リージョンごと、機能ごと。
2)制限アルゴリズム
2.1トークンバケット
パラメータ:'rate' (tokens/sec)、 'burst' (bucket size)。
「クレジット」のような作品:蓄積されたトークンは短いピークを許可します。
外部APIやユーザーリクエストに適しています。
2.2漏れやすいバケツ
スムーズに一定の速度で流れを「出血」します。
敏感なバックエンドへのトラフィックをスムーズにするのに適しています。
2.3固定/スライディングウィンドウ
固定ウィンドウ:シンプルですが「、ウィンドウスイッチング」に対して脆弱です。
スライドウィンドウ:より正確ですが、計算上はより高価です。
2.4 GCRA (Generic Cell Rateアルゴリズム)
トークンバケットは仮想到着時間に相当します。
分散リミッターの正確で安定した(競合しない状態)。
2.5並行限度額
同時操作の制限。
スレッド/接続プールおよびヘッド・オブ・ライン・ブロッキングの枯渇から保護します。
3)制限を適用する場所
国境(L7/APIゲートウェイ)で:メインバリア、迅速な故障(429/503)、安価なチェック。
インサイドサービス:重い業務(輸出、レポート、変革)の追加キャップ。
外部システムへの出口で:第三者のための個々の制限(反罰)。
キュー/ワーカーで:共有プールへの公平性。
4)スコープと優先順位(マルチテナント)
Иерархия:グローバル→リージョン→テナント/プラン→ユーザー/トークン→エンドポイント/機能→IP/デバイス。
優先度対応:VIP/Enterpriseは「バースト」と重量が増えますが、全体的なSLOを壊すことはありません。
Limit composition: total tolerance='min (global、 regional、 tenant、 user、 endpoint)'。
5)ボリュームクォータ
毎日/毎月のクォータ:ドキュメント/日、GB/月、メッセージ/分。
ソフト/ハードしきい値:警告(80/90%)とハードストップ。
ロールアップ:請求にオブジェクト(テーブル、ファイル、イベント)と「出金」による会計。
6)分散リミッター
要件:低遅延、一貫性、フォールトトレランス、水平スケーリング。
ローカル+確率同期:ローカルシャードバケット+周期同期。
セントラルストア:Redis/KeyDB/Memcached-LUA/atomic ops (INCR/PEXPIRE)。
Sharding:フォームのキー'limit: {scope}: {id}: {window}'と一様分布。
クロックスキュー:クライアントではなく、リミッターサーバーに「真実」を保存します。
Idempotency: Idempotency-Keysは偽の請求を減らします。
7)反乱用および保護
パブリックエンドポイント用のPer-IP+デバイスフィンガープリント。
異常におけるProof-of-Work/CAPTCHA。
UXがより重要な場合には、完全な障害の代わりに減速(スロットリング)(検索プロンプト)。
適応限界:インシデント/高価な劣化のしきい値の動的削減。
8)クライアントの行動とプロトコル
コード:'429リクエストが多すぎる'(レート)、'403'(クォータ/プランを超えた)、'503'(保護劣化)。
ベストプラクティス:- 'Retry-After:
'-再試行するタイミング。
- 'RateLimit-Limit:
; w= ' - 'RateLimit-Remaining:
' - 'RateLimit-Reset:
' - バックオフ:指数+ジッタ(完全ジッタ、等しいジッタ)。
- Idempotency: 'Idempotency-Key'ヘッダーと安全な操作の再現性。
- タイムアウトとキャンセル:制限を「キャプチャ」しないように、中断されたリクエストを正しく中断します。
9)観察可能性およびテスト
技術:'tenant_id'、 'plan'、 'user_id'、 'endpoint'、 'region'、 'decision' (allow/deny)、 'reason' (quota/rate/concurrency)。
メトリクス:スループット、429/403/503障害率、p95/p99リミッタ遅延、キーキャッシュヒット率、計画割り当て。
監査ログ:ブロックの原因、トップ「騒々しい」キー。
テスト:ロードプロファイル「saw/burst/plateau」、カオス-Redis/shardの失敗、クロックの非同期。
10)請求との統合
使用カウンターは境界で収集され、バッチ(N分ごと)で集計されます。
計画の概要:過剰な→過充電または一時的に計画を増やす。
相違:和解の使用法と請求書;デルタへの警告。
11)中の公平さ(キュー、労働者)
Weighted Fair Queuing/DRR:計画重量でテナントにスロットを割り当てる。
テナント単位の労働者プール:VIP/騒々しいの堅い分離。
アドミッションコントロール:クォータが使い果たされた場合の実行前の失敗;キューは膨らみません。
同時性のキャップ:同時重いジャブを制限します。
12)典型的な計画プロファイル(例)
yaml plans:
starter:
rate: 50 # req/s burst: 100 concurrency: 20 quotas:
daily_requests: 100_000 monthly_gb_egress: 50 business:
rate: 200 burst: 400 concurrency: 100 quotas:
daily_requests: 1_000_000 monthly_gb_egress: 500 enterprise:
rate: 1000 burst: 2000 concurrency: 500 quotas:
daily_requests: 10_000_000 monthly_gb_egress: 5000
13)建築リファレンス(口頭スキーム)
1.Edge/APIゲートウェイ:TLS→extract context(テナント/プラン)→check limits/quotas→place RateLimitヘッダー→log/trace。
2.ポリシーエンジン:優先順位規則(VIP)、適応しきい値。
3.リミッターストア:Redis/KeyDB(アトミックオプス、LUA)、キーシャーディング、レプリケーション。
4.サービス:重い操作のための二次限界そして帽子;idempotency;WFQ/DRRのキュー。
5.使用法/請求:しきい値による収集、集計、請求書、アラート。
6.観測性:タグ付けされたメトリック/ログ/トレイル、テナントごとのダッシュボード。
14)売り上げ前のチェックリスト
- 制限スコープ(テナント/ユーザー/トークン/エンドポイント/IP)とその階層が定義されています。
- 選択されたアルゴリズム(Token Bucket/GCRA)と'rate/burst'パラメータ。
- 重いオペレーションのための同時キャップと入場管理を実装しました。
- 'RateLimit-'と'Retry-After'ヘッダーが含まれています。クライアントはbackoff+jitterをサポートします。
- リミッターは分散し、フォールトトレラント(シャード、複製、劣化)です。
- Usage-collectionはidempotentです。請求とバンドル、過保持のためのアラート。
- Observability:メトリック/トレイル/タグ付きログ、トップ「ノイズ」キー、変更。
- テスト:バースト「、のこぎり」、storの失敗、時計のスキュー、コールドスタート。
- 顧客ドキュメント:プランの制限、429/Retry-After例、ベストプラクティスの再試行。
- 除外ポリシー:一時的に制限を上げる方法と時期。
15)典型的なエラー
テナントごと/エンドポイントごとのグローバル制限-「noisy neighbor」はすべてのSLOを破ります。
「バースト」の欠如:UXは短いバーストで苦しんでいます。
固定ウィンドウのみ→「ウィンドウの境界にダブルヒット」を使用します。
ジッタ→反復の嵐では、特異性やリトレイはありません。
サービス/キュー→内部の「交通渋滞」のキャップなしで、境界線でのみ制限します。
応答の制限を拒否しない('Retry-After'、 'RateLimit-')→クライアントは適応しません。
OLTPデータベースのリミッター状態のストレージ→高遅延とホットロック。
16)クイック戦略の選択
ピークを持つ公開API: Token Bucket+large 'burst'、 RateLimit-ヘッダー、CDN/エッジキャッシュ。
内部重いジャブ:同時キャップ+WFQ/DRR、入場制御。
サードパーティとの統合:別々の出口限界、バッファリング/リトレイ。
SaaSマルチテナント:リミット階層(グローバル→テナント→ユーザー→エンドポイント)、VIP優先順位付け、月間クォータ。
お知らせいたします
優れたレート制限とクォータは、プラットフォームとクライアント間のシステム契約です。リソースの正直な共有、スパイクへの耐性、予測可能なSLO、透明請求。アルゴリズム(Token/GCRA+並行キャップ)を組み合わせ、ospreysの階層を実装し、明確なヘッダーとメトリックを与え、実際のトラフィックプロファイルの下でスキームを定期的にチェックします。このようにして、プラットフォームは積極的な負荷増加でも安定した状態を維持します。