GuavaにおけるトークンバケツアルゴリズムRateLimiterの理解について
1710 ワード
我々のシステムは現在、mqメッセージを受信し、まずredisキューに配置し、それからredisキューからタスクを取って消費し、上流でデータをブラシすると、redisキュータスクが非常に多くなります.このとき、私たちは消費するときにredisの安定性を考慮するだけでなく、下流のリソースを呼び出すことでリソース能力を提供することも考慮します.リソースが制限され、処理能力があまり強くないリソースに対しては、保護を与えなければならない(下流のリソースが処理性能を向上させることができない場合、または短時間で処理性能を向上させることができない場合).ストリーム制限器または同様の保護メカニズムを使用して、下流サービスのクラッシュによる全体的なサービスの使用不可を回避できます.これはGuavaのトークンバケツアルゴリズムRateLimiterを使ったものです
RateLimiterはJDKの信号量Semphoreに似ており、リソースへの同時アクセスのスレッド数を制限するために使用されています.
ブロックされていない形式で使用することもできます.
次にコードテストを見て、例を通して原理を理解することができます.
RateLimiterのブログを紹介します
http://ifeve.com/guava-ratelimiter/
http://blog.csdn.net/cloud_ll/article/details/43602325
http://www.voidcn.com/blog/jiesa/article/p-4943128.html
http://www.jianshu.com/p/3dfae5c15eb9
RateLimiterはJDKの信号量Semphoreに似ており、リソースへの同時アクセスのスレッド数を制限するために使用されています.
RateLimiter limiter = RateLimiter.create(10); // 10
limiter.acquire(); // RateLimiter, 10
executor.submit(runnable); //
ブロックされていない形式で使用することもできます.
If(limiter.tryAcquire()){ // limiter false
doSomething();
}else{
doSomethingElse();
}
次にコードテストを見て、例を通して原理を理解することができます.
public static void main(String args[]){
//5000 :2007ms
//40000 :259ms
// :2ms 2 ,
long startTime=System.currentTimeMillis();
/**
* 10000
* , , , ,
*/
RateLimiter rateLimiter = RateLimiter.create(40000);
//rateLimiter.setRate(40000);
//
for(int i=0;i<10000;i++){
rateLimiter.acquire();
}
long endTime=System.currentTimeMillis();
System.out.println(" :"+(endTime-startTime)+"ms");
}
RateLimiterのブログを紹介します
http://ifeve.com/guava-ratelimiter/
http://blog.csdn.net/cloud_ll/article/details/43602325
http://www.voidcn.com/blog/jiesa/article/p-4943128.html
http://www.jianshu.com/p/3dfae5c15eb9