リーキーバケット vs トークンバケットのレート制限
リーキーバケットとトークンバケットのレート制限アルゴリズムを比較します。それぞれの使用タイミングとバーストトラフィックの処理方法の違いを理解します。
Token Bucket
詳細な説明
リーキーバケット vs トークンバケット
両方のアルゴリズムはリクエストのレートを制御しますが、バーストトラフィックの処理方法は大きく異なります。
リーキーバケット
リーキーバケットは、到着するリクエスト数に関係なく、固定の一定レートでリクエストを処理します。受信リクエストはキュー(バケット)に置かれます。キューが満杯の場合、新しいリクエストはドロップされます。
受信 [キュー/バケット] 送出
||| --> [req][req][req] --> | (一定レート)
[req][req]
特性:
- 出力レートは完全に平滑
- 出力にバーストなし
- レイテンシが増加(リクエストがキューで待機)
- 使用例:Shopify(40リクエストバケット、2 req/sリークレート)
トークンバケット
トークンバケットは、トークンが利用可能な限り、リクエストの即時転送を許可します。トークンは時間の経過とともに蓄積されます。
トークン: [*][*][*][*][*]
リクエスト到着 --> 1トークン消費 --> 即時転送
トークンなし? --> 拒否 (429)
特性:
- バケットサイズまでのバーストを許可
- 許可されたリクエストにレイテンシ追加なし
- 拒否されたリクエストは即座に429
- 使用例:AWS API Gateway、ほとんどのクラウドAPI
使い分け
| シナリオ | 推奨 | 理由 |
|---|---|---|
| APIゲートウェイ | トークンバケット | ユーザーは低レイテンシを期待 |
| バックグラウンドジョブキュー | リーキーバケット | 平滑な処理が好ましい |
| 決済処理 | リーキーバケット | ダウンストリームの一定負荷 |
| インタラクティブUI | トークンバケット | UXに適したバースト対応 |
| Webhookデリバリー | リーキーバケット | 予測可能な配信レート |
ユースケース
APIのレート制限戦略を選択しています。APIには2種類のコンシューマーがあります:低レイテンシのバーストアクセスが必要なインタラクティブWebクライアントと、スムーズにスロットリングされるべきバッチ処理クライアントです。各コンシューマータイプにどのアルゴリズムを適用すべきかを理解する必要があります。