blog

リーキーバケットアルゴリズム

リーキーバケットアルゴリズムはトークンバケットと似ていますが、実際には2つの戦略があります。トークンバケットアルゴリズムを理解したい場合は、記事を読んでください。 図に示すように、アルゴリズム全体は実...

Aug 3, 2020 · 2 min. read
シェア

電流制限にはいくつかの主なアルゴリズムがあります:

  • 固定ウィンドウカウント
  • スライディングウィンドウアルゴリズム
  • 脆弱性アルゴリズム
  • トークンバケットアルゴリズム

この記事では、リーキーバケットアルゴリズムについて紹介します。リーキーバケットアルゴリズムの具体的な概念は以下の通りです:

リークバケットアルゴリズムはトークンバケットに似ていますが、実際には2つの戦略があります。トークンバケットアルゴリズムを理解したいなら、この記事を読んでください。下のウィキペディアのイメージを見てください:

図を見てお分かりのように、実はアルゴリズム全体は非常にシンプルです。まず、一定の容量のバケツがあって、そこに水が流れ込み、水が流れ出します。流れ込む水については、どれだけの量の水が流れ込むか、どれだけの速さで水が流れるかを予測する方法はありません。しかし、流れ出る水については、バケツは水が流れ出る速度を固定することができます。また、バケツが満杯になると、余分な水が溢れます。リーキーバケツアルゴリズムが使われると、インターフェイスがリクエストを 一定の割合で処理することが保証されます。

実際、リーキーバケット・アルゴリズムは、主に以下のパラメータを制御するものです:

 // バケット容量
 public int capacity = 10;
 // 現在の水量
 public int water = 0;
 //流量/秒
 public int rate = 4;
 // 最後の給水時間
 public long lastTime = System.currentTimeMillis();

具体的なロジックは以下の通り:

public class LeakyDemo {
 public long timeStamp = System.currentTimeMillis(); // 現在時刻
 public int capacity; // バケット容量
 public int rate; // 水漏れの速度
 public int water; // 現在の水量
 public boolean acquire() {
 long now = System.currentTimeMillis();
 water = max(0, water - (now - timeStamp) * rate); // 最初に漏れを実行し、残りの水を計算する。
 timeStamp = now;
 if ((water + 1) < capacity) {
 // 水を追加しようとすると、水はまだいっぱいではない。
 water += 1;
 return true;
 } else {
 // 水が満杯で、水を追加することを拒否する
 return false;
 }
 }
}

上記は、最も単純な脆弱性アルゴリズムの実装では、リーキーバケットアルゴリズムとトークンバケットアルゴリズムが異なっている、リーキーバケットアルゴリズムは、均一な実行であり、トークンバケットサポートバーストだけでなく、ウォームアップ、独自のニーズの特定のニーズはそれを必要とします。同時に、リーキーバケットアルゴリズムは、オーバーフロー処理を行う必要がありますが、トークンバケットは必要ありません。

Read next

一般的なLinuxコマンド(centos7を例に挙げる)

ソフトリンクptrを入力すると、pwdはptrがあるディレクトリを、pwd -Pはptrが指すディレクトリを表示します。 次に、b として host2 にログオンし、path2 ファイルに書き込みます。 変更されたファイルだけを同期させることもできます。 ctrl+r repeat; u undo. man check...

Aug 3, 2020 · 5 min read