今回は、トークンバケットアルゴリズムについてメモしていきたいと思います。
トークンバケットアルゴリズムとは

image ref: What is the difference between token bucket and leaky bucket algorithms? – Quora
トークンバケットアルゴリズムとは、あるシステムやプログラムにおいて、一定の時間間隔で一定数のトークン(記号やデータの単位)を使用することを制限するアルゴリズムです。
例えば、APIのリクエスト制限などで使用されることがあります。
トークンバケットアルゴリズムでは、トークンをバケット(容器)に入れて管理し、トークンを使用するたびにバケットからトークンを取り出します。一定の時間間隔でバケットに新しいトークンを追加することができ、バケットが満杯の場合は新しいトークンが追加されずに破棄されます。
トークンバケットアルゴリズムは、一定のリソースを効率的に制御するために使用されます。リクエストの制限やスロットリングなど、リソース使用の制限が必要な場合に有効なアルゴリズムとして利用されています。また、トークンバケットアルゴリズムは、複雑なアルゴリズムに比べて実装が簡単であり、スケーラビリティにも優れているため、幅広い分野で利用されています
トークンバケットアルゴリズムをどこに配置するか
Webアプリケーションにおいて、トークンバケットアルゴリズムは通常、サーバーサイドで実装されます。
バックエンドサーバー
トークンバケットアルゴリズムは、クライアントからのリクエストを受け取った後に、リクエストに含まれるテキストデータをトークンに分割し、バケットにグループ化する処理を行います。バックエンドサーバーは、この処理を担当し、トークンバケットアルゴリズムを実装することで、リクエストされたテキストデータをバッチ学習に適した形式に変換することができます。
APIエンドポイント
Webアプリケーションが外部のAPIを利用する場合、APIエンドポイントにトークンバケットアルゴリズムを実装することがあります。APIエンドポイントは、外部のAPIとの通信を担当し、リクエストされたデータをトークンに分割し、バケットにグループ化する処理を行います。このようにすることで、外部のAPIに送信するデータをバッチ学習に適した形式に変換することができます。
バッチ処理ジョブ
Webアプリケーションにおいて、定期的に大量のテキストデータを処理するバッチ処理ジョブがある場合、トークンバケットアルゴリズムをバッチ処理ジョブ内に実装することがあります。バッチ処理ジョブは、定期的にデータを収集し、バッチにグループ化して学習を行うため、トークンバケットアルゴリズムを使用することで、バッチ内のテキストデータを効率的に処理することができます。
以上のように、トークンバケットアルゴリズムは、Webアプリケーションのサーバーサイドで実装されることが一般的です。
ただ、要件や設計によって異なりますので、Webアプリケーションのアーキテクチャーやデザインに合わせて検討する必要があります。
例えば、バックエンドサーバーに実装する場合、Webアプリケーションのフレームワークやライブラリを使用して、リクエストの前処理やデータの分割、バケットへのグループ化を行うことができます。また、APIエンドポイントに実装する場合は、APIゲートウェイやリバースプロキシを使用して、リクエストの前にトークンバケットアルゴリズムを適用することができます。バッチ処理ジョブの場合は、バッチ処理ジョブのコード内にトークンバケットアルゴリズムを組み込むことができます。
レートとは
レートは、単位時間あたりに発生するイベントの数を示す指標です。一般的には、時間あたりの平均的な発生数を表します。Webアプリケーションでは、リクエストのレートは単位時間あたりに送信されるリクエストの数を示します。レートは、システムやアプリケーションの性能や負荷を評価する際に重要な指標として使用されることが多いです。
メリット・デメリット
トークンバケットアルゴリズムのメリットとデメリットを以下にまとめます。
メリット
- トークンバケットアルゴリズムは、リクエストやバッチ処理ジョブを効率的に制御することができます。トークンの数やリクエストの割り当てを設定することで、アプリケーションやシステムの負荷を制限することができます。
- トークンバケットアルゴリズムは、リクエストやジョブのバーストを制御することができます。一定のレートでのリクエストを制限することで、システムへの過負荷を防ぎ、安定したパフォーマンスを維持することができます。
- トークンバケットアルゴリズムは、簡単に実装することができます。単純な数学的なアルゴリズムであり、一般的に効率的なリクエスト制御を実現することができます。
デメリット
- トークンバケットアルゴリズムは、正確なリクエストやジョブの制御を行うために、一定のオーバーヘッドを持ちます。トークンの数やリクエストの割り当てを細かく設定することで、精密な制御を行うことができますが、管理が複雑になる可能性があります。
- トークンバケットアルゴリズムは、複雑なアプリケーションやシステムに対して適用しづらい場合があります。特定のリクエストやジョブに対して、異なる制限を設けたい場合には、より高度なアルゴリズムが必要になる可能性があります。
- トークンバケットアルゴリズムは、単純なリクエスト制御を実現するためのアルゴリズムであり、セキュリティや複雑な認証/認可の制御を実現するためには、他の手法やアルゴリズムと併用する必要があるかもしれません。
トークンバケットアルゴリズム以外のレートミッター
以下はリクエストやジョブのレートを制限するためのアルゴリズムや手法の一部です。
スライディングウィンドウカウンター (Sliding Window Counter)
一定の時間窓に対して、リクエストやジョブの数をカウントして制限をかけるアルゴリズムです。時間窓内におけるリクエスト数を記録し、設定されたレートを超える場合にはリクエストを拒否します。
トークンリプレニッシュメントアルゴリズム (Token Replenishment Algorithm)
トークンバケットアルゴリズムと同様にトークンを使用してリクエストを制御するアルゴリズムですが、トークンの補充方法が異なります。トークンを定期的に補充することで、リクエストのレートを制限します。
トークンバンクアルゴリズム (Token Bank Algorithm)
トークンバケットアルゴリズムと類似したアルゴリズムで、トークンを銀行口座のように保持し、リクエストごとにトークンを引き出していくことでレートを制限します。トークンの引き出しに制限を設けることで、レートを制御します。
トークンレスポンスタイムアルゴリズム (Token Response Time Algorithm)
レスポンスタイムをもとにリクエストのレートを制御するアルゴリズムです。レスポンスタイムが許容範囲内であればリクエストを許可し、レスポンスタイムが閾値を超えるとリクエストを制限します。
