最近、当社の業務システムは、トークン バケット アルゴリズムに基づいて実装された Guava の RateLimiter 電流制限コンポーネントを導入しました。トークン バケットは非常に古典的な電流制限アルゴリズムです。この記事では、いくつかの古典的な電流制限アルゴリズムについて説明します。 電流制限とは何ですか?Wikipedia のコンセプトは次のとおりです。
簡単に訳すと、コンピュータ ネットワークでは、電流制限はネットワーク インターフェイスが要求を送受信する速度を制御することです。これにより、DoS 攻撃を防ぎ、Web クローラーを制限できます。 電流制限、フロー制御とも呼ばれます。これは、システムが高い同時実行性や大量のトラフィック要求に直面した場合、システムの安定性を確保するために、システムへの新しい要求のアクセスを制限することを意味します。現在の制限により、一部のユーザー リクエストが予定より遅れて処理されたり拒否されたりするため、ユーザー エクスペリエンスに影響します。したがって、通常はシステムの安定性とユーザー エクスペリエンスのバランスを取る必要があります。実際の例を見てみましょう。 ★人気の観光スポットでは、1日あたりの観光客の入場人数に制限を設けているところもあります。チケットは1日あたり5,000枚など、一定枚数のみ販売されます。メーデーや国慶節の連休中に遅く行くと、その日のチケットが売り切れていて、入場して遊ぶことができない場合があります。たとえ入場できたとしても、行列が長すぎて自分の命が危ぶまれるほどです。 ” 一般的な電流制限アルゴリズム固定ウィンドウ電流制限アルゴリズムまず、カウンターを維持し、単位時間をウィンドウとして扱います。カウンターは、このウィンドウで受信されたリクエストの数を記録します。
単位時間が 1 秒、電流制限しきい値が 3 であると仮定します。 1 秒の単位時間内の各リクエストごとに、カウンターは 1 ずつ増加します。カウンターの累積回数が現在の制限しきい値の 3 を超えると、後続のすべてのリクエストは拒否されます。 1 秒が経過すると、カウンターは 0 にクリアされ、再びカウントを開始します。以下のように表示されます。 疑似コードは次のとおりです。
しかし、このアルゴリズムには明らかな重大な問題があります。現在の制限しきい値が 5 リクエストで、単位時間ウィンドウが 1 秒であると仮定すると、単位時間の最初の 0.8 ~ 1 秒と 1 ~ 1.2 秒にそれぞれ 5 つの同時リクエストを行うとします。いずれも閾値を超えていないものの、0.8~1.2秒で計算すると同時接続数が10にも達し、単位時間1秒あたり5回以下の閾値の定義を超えてしまいます。 スライディングウィンドウ電流制限アルゴリズムスライディング ウィンドウ電流制限は、固定ウィンドウ臨界値の問題を解決します。単位時間を n 個の小期間に分割し、各小期間におけるインターフェースアクセス数を記録し、時間スライドに基づいて期限切れの小期間を削除します。 スライディング ウィンドウ アルゴリズムを図で説明すると次のようになります。 単位時間が依然として 1 秒であると仮定すると、スライディング ウィンドウ アルゴリズムはそれを 5 つの小さな期間に分割します。つまり、スライディング ウィンドウ (単位時間) は 5 つの小さなグリッドに分割されます。各グリッドは 0.2 秒を表します。 0.2 秒ごとに、時間ウィンドウは 1 グリッド右にスライドします。そして、それぞれの小周期には独立したカウンターがあり、リクエストが 0.83 秒で到着すると、0.8 ~ 1.0 秒に対応するカウンターが 1 増加します。 スライディング ウィンドウが重大な問題をどのように解決するかを見てみましょう。 現在の 1 秒以内の制限しきい値が依然として 5 件のリクエストであり、5 件のリクエストが 0.8 ~ 1.0 秒以内 (たとえば 0.9 秒) に発生し、黄色のグリッドに該当すると仮定します。 1.0 秒後、さらに 5 件のリクエストが届き、紫色のボックスに入ります。固定ウィンドウアルゴリズムであれば制限はありませんが、スライディングウィンドウであれば、小さなサイクルごとに 1 つの小さなグリッドを右に移動します。 1.0秒後、右に1つの小さなグリッドに移動します。現在の単位時間は0.2〜1.2秒です。このエリアのリクエストは5の制限を超えており、現在の制限がトリガーされています。実際、紫色のグリッド内のすべてのリクエストは拒否されています。 ヒント: スライディング ウィンドウを分割するグリッド期間が多いほど、スライディング ウィンドウのスクロールがスムーズになり、電流制限の統計がより正確になります。 スライディング ウィンドウ アルゴリズムの疑似コードは次のとおりです。
スライディング ウィンドウ アルゴリズムは固定ウィンドウの重大な問題を解決しますが、現在の制限に達すると、要求は直接かつ激しく拒否されます。この方法では、いくつかのリクエストが失われることになり、実際には製品にとってあまり好ましくありません。 リーキーバケットアルゴリズムリーキー バケット アルゴリズムは、電流制限に直面したときにより柔軟であり、直接的で失礼な拒否はありません。 その原理は非常に単純で、水の注入と漏水のプロセスと考えることができます。漏れやすいバケツには水が任意の速度で流れ込み、水は固定速度で流れ出ます。水がバケツの容量を超えると、あふれて廃棄されます。バケット容量が一定なので、全体のレートが保証されます。
リーキーバケットアルゴリズムの疑似コードは次のとおりです。
通常のトラフィックの間、システムは一定の速度でリクエストを処理します。これが私たちの望む動作です。ただし、トラフィックのバーストが発生した場合、リーキー バケット アルゴリズムは依然として従来の方法でリクエストを処理しますが、これは望ましいことではありません。トラフィックが急増した場合、システムがリクエストをできるだけ早く処理してユーザー エクスペリエンスを向上できることを期待しています。 トークンバケットアルゴリズムバーストトラフィックが発生した場合は、トークン バケット アルゴリズムを使用してフローを制限できます。 トークンバケットアルゴリズムの原理:
リーキーバケットアルゴリズムの疑似コードは次のとおりです。
トークン発行戦略が正しければ、システムの停滞は起こらず、マシンの利用率も向上します。 Guava の RateLimiter 電流制限コンポーネントは、トークン バケット アルゴリズムに基づいて実装されています。 この記事はWeChat公式アカウント「カタツムリを拾う少年」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、カタツムリを採る少年の公式アカウントまでご連絡ください。 |
<<: 図解された Raft コンセンサス アルゴリズム: ログを複製する方法は?
>>: 市場規模は22億を超えるか?教育用ロボットは急速に発展している
近年、私たちは時代の広大さと大きな変化を痛感しています。潮流の下では、個人は泥や砂のように小さく、そ...
何が起こっているのか?アリは新しい仕事を思いついたようです—— MotionShop では、他のシー...
研究者たちは、特定の昆虫の神経系の機能が、決定論的、確率的、揮発性、不揮発性メモリの機能とどのように...
このタイトルで説明されているのは、SF映画の架空の筋書きではなく、現実のことです。ペンシルバニア大学...
序文ブルートフォース クラッキング ツール hashcat を使用したことがある人なら誰でも、このソ...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
大規模言語モデル (LLM) アプリケーションは世界中で急速に普及していますが、企業は依然として大規...
「サッカーのフィールドで最もタブーなことは、誰もが明らかなファウルに気づいているのに審判が見て見ぬ...
2020年はニュース速報に事欠かなかったが、人工知能は依然として包囲網を突破し、主流の視野に入り込...