電流制限にはいくつかの主なアルゴリズムがあります:
- 固定ウィンドウカウント
- スライディングウィンドウアルゴリズム
- 脆弱性アルゴリズム
- トークンバケットアルゴリズム
この記事では、リーキーバケットアルゴリズムについて紹介します。リーキーバケットアルゴリズムの具体的な概念は以下の通りです:
リークバケットアルゴリズムはトークンバケットに似ていますが、実際には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;
}
}
}
上記は、最も単純な脆弱性アルゴリズムの実装では、リーキーバケットアルゴリズムとトークンバケットアルゴリズムが異なっている、リーキーバケットアルゴリズムは、均一な実行であり、トークンバケットサポートバーストだけでなく、ウォームアップ、独自のニーズの特定のニーズはそれを必要とします。同時に、リーキーバケットアルゴリズムは、オーバーフロー処理を行う必要がありますが、トークンバケットは必要ありません。




