この記事では、主にRatelimit-次のように、Guavaを使用してインターフェイスフロー制限を実行することの関連コンテンツを研究しています。
1。問題の説明
ある日、A氏は突然、彼のインターフェースのリクエストの数が突然、前のインターフェースの10倍に増加したことを発見しました。それから間もなく、インターフェイスはほとんど使用できず、システム全体が崩壊する原因となる連鎖反応を引き起こしました。この状況に対処する方法は?人生は私たちに答えを与えてくれます:たとえば、昔ながらのスイッチにはヒューズが装備されています。誰かが超高出力機器を使用すると、ヒューズは吹き飛ばされ、各アプライアンスが強力な電流によって燃えないように保護します。同様に、予期せぬリクエストによってシステムへの過度の圧力によって引き起こされるシステム麻痺を防ぐために、「ヒューズ」でインターフェイスをインストールする必要があります。トラフィックが大きすぎる場合、拒絶や排水などのメカニズムを採用できます。
2。一般的に使用される電流制限アルゴリズム
一般的に使用される2つの電流制限アルゴリズムがあります:漏れやすいバケットアルゴリズムとトークンバケットアルゴリズム。
漏れているバケットアルゴリズムのアイデアは非常に簡単です。最初に漏れているバケツを入力してください。漏れているバケツは一定の速度で出てきます。水要求が大きすぎると、直接オーバーフローします。漏れているバケットアルゴリズムは、データの送信レートを強制的に制限できることがわかります。
図1漏れたバケットアルゴリズムの概略図
多くのアプリケーションシナリオでは、データの平均伝送速度を制限できることに加えて、ある程度のバースト送信を許可する必要があります。現時点では、漏れたバケットアルゴリズムが適していない場合があり、トークンバケットアルゴリズムの方が適しています。図2に示すように、トークンバケットアルゴリズムの原理は、システムが一定の速度でトークンをバケットに入れることです。リクエストを処理する必要がある場合は、最初にバケットからトークンを取得する必要があります。バケットにトークンがない場合、サービスは拒否されます。
図2トークンバケットアルゴリズムの概略図
3。現在の制限ツールクラスのラトリミッター
GoogleのオープンソースツールキットGuavaは、「トークンバケットアルゴリズム」に基づいたRatelimiterクラスを提供し、使用するのに非常に便利です。このクラスインターフェイスの特定の使用については、Ratelimiterの使用方法を参照してください。
デモを使用したRatelimiter
パッケージratelimite; Import com.google.common.util.concurrent.ratelimiter; public class ratelimiterdemo {public static void main(string [] args){testnoratelimiter(); testwithratelimiter(); 0; i <10; system.out.println( "call execute .."+i);} system.out.println(end -start);} ratelimiter.create(10.0); // 1秒以下のタスクは(int i = 0; i <10; i ++){limiter.acquire(); // request ratelimiterで提出されます。 始める);}} 4つのGuavaの同時性:リスニング可能なFutureおよびRatelimiterの例
コンセプト
聞き取ることができるように、名前が示すように、聴くことができる未来であり、Javaネイティブの未来への拡張強化です。将来は非同期計算タスクを表し、タスクが完了したときに計算結果を取得できることがわかっています。結果を取得し、計算が完了したらユーザーに表示する場合、または他の計算を実行する場合は、別のスレッドを使用して計算ステータスを絶えず照会する必要があります。これにより、コードが複雑で非効率的になります。リスニング可能なFuture Guavaを使用して、将来が完了したかどうかを検出してください。完了した場合、コールバック関数が自動的に呼び出され、同時プログラムの複雑さを減らすことができます。
2番目の方法では、将来のリターン値またはハンドルエラーを直接取得できるため、2番目の方法が推奨されます。本質的に、2番目の方法は、最初の方法を動員することによって達成され、さらなるカプセル化が行われます。
さらに、聴取可能なFutureには、他にもいくつかの組み込みの実装があります。
SettableFuture:返品値を計算する方法を実装する必要はありませんが、返品値として戻るには固定値のみが必要です。プログラムを通じて、この将来の返品値または例外情報を設定できます。
CheckedFuture:これは、聴取可能なFutureインターフェイスから継承されています。 Checkedget()メソッドを提供します。この方法は、将来の実行で例外が発生したときに指定されたタイプの例外をスローすることができます。
RatelimiterはJDKのセマフォに似ています。リソースに同時にアクセスするためにスレッドの数を制限するために使用されます。この記事では、Ratelimiterの使用を紹介します。
コードの例
Import java.util.concurrent.callable; import java.util.concurrent.executionexception; import java.util.concurrent.executors; Import java.util.concurrent.timeunit; import com.google.common.util.current.futurecallback; com.google.common.util.concurrent.futures; import com.google.common.util.concurrent.listenableFuture; Import com.google.common.util.concurrent.listeningexecutorservice; Import com.google.common.util.concurrent.comonent.utilent.common.util.common.util.common.util.common.util.common.util. com.google.common.util.concurrent.ratelimiter; public class reshingable futuredemo {public static void main(string [] args){testrateLimiter(); testlistenableFuture();}/*** ratelimiterは、jdk semphoreに似ています。 testrateLimiter(){rienseExecutorService executorservice = moreexecutors .listeningdecorator(executors.newcachedthreadpool()); ratelimiter limiter = ratelimiter.create(5.0); // 4タスクは4タスクを超えています。 Ratelimiterを超える許可が最終的に聞き取り可能<integer>聴取可能future = executorservice .submit(new Task( "is"+ i));}} public static void testListenableFuture(){ristensexecutorservice executorservice = executortors .decorator(); final ristenablefuture <integer> listenablefuture = executorservice .submit(new Task( "testListenableFuture")); //コール結果を同期してみてください{system.out.println(reshinablefuture.get();} catch(interruptedexcection e1){e1.printstacktrace executex();} {e1.printstacktrace();} //最初の方法ListenableFuture.AddListener(new runnable(){@Override public void run(){try {listenable future's result's result " + listenablefuture.get();} catch(E.PrintedectipTacktrace(); executorservice); // 2番目の方法Futures.addcallback(ressingableFuture、new futurecallback <integer>(){@Override public void onsuccess(integer result){system.out .println( "コールバックで聞き取り可能な未来の結果を得る); {t.printstacktrace();}});}}クラスタスク実装コール可能<integer> {string str; public task(string str){this.str = str;}@override public integer call()throws {system.out.println( "call execute .." + str); timeunit.seconds.secondss shook(1);Guavaバージョン
<Dependency> GroupId> com.google.guava </groupid> <artifactid> guava </artifactid> <バージョン> 14.0.1 </version> </dependency>
要約します
上記はすべてRatelimitについてです - Guavaを使用して、インターフェースの現在の制限コードの例を作成します。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!