リーキーバケット 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クライアントと、スムーズにスロットリングされるべきバッチ処理クライアントです。各コンシューマータイプにどのアルゴリズムを適用すべきかを理解する必要があります。

試してみる — Rate Limit Calculator

フルツールを開く