キャッシュ、降格および電流制限:非常に並行システムの開発では、3つのシステムを保護するために使用される武器があります。だから、電流制限、それは何ですか?名前が示すように、それはあなたのブロードバンドパケットトラフィックGのように、流量制限を制限し、なくなって実行することです。限定することで、我々はよくシステムを保護する目的を達成するように、システムQPSを制御することができます。Benpianは、一般的な制限アルゴリズムとその特徴を紹介します。
アルゴリズムの紹介
カウンター法
カウンター法は制限最も単純で簡単に実装されたアルゴリズムにおけるアルゴリズムです。例えば、Aインタフェースのための私達の引当金は、我々は100以上の1分間の訪問のためにすることはできません。その後、我々はこれを行うことができます:カウンタ100と、時間間隔の値は、第1の要求と要求よりも大きい場合は初めに、我々は、カウンタがインクリメントされるたびに要求が終わって、カウンターのカウンターを、設定することができます1分以内に、その後、あまりにも多くの要求その;最初の要求は、1分よりも大きく、また、カウンタ流量範囲の値を制限する場合、要求間隔、カウンタがリセットされ、次のアルゴリズムは、特定の模式図であります:
具体的には以下の擬似コード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{クラスCounterDemoパブリック パブリックロングtimeStampに= getNowTime(); 公共INT reqCount = 0; 公共INT制限ファイナル= 100;時間ウィンドウ内の要求の//最大数 公共最終長い間隔= 1000; //時間ウィンドウMS パブリックブールグラント() { ロングgetNowTime = NOW(); IF(今<+間隔timeStampに){ //時間ウィンドウ内 reqCount ++; //は、要求の数が最大制御電流の時間窓超えているか否かを判定する リターンreqCount <=上限を、 } 他{ timeStampに今= ; //リセットタイムアウト後 reqCount = 1; 真への復帰; } } } |
このアルゴリズムは単純ですが、重要な問題である非常に致命的な問題がある、私たちは見て:
私たちは、そう実際には1でユーザ秒そこに、彼は午後12時59分にあった、と瞬時に100件のリクエストを送信し、1時と瞬時に100件のリクエストを送信し、あなたが悪意のあるユーザーがあると、上の図から見ることができます200の要求が即座に送信されます。私たちは、すなわちアップ要求あたり1.7に、ユーザーの要求がリセットノード時間ウィンドウをバースト、我々はすぐにレート制限を超えることができ、所定の要求100にわずか1分を持っています。この脆弱性により、ユーザーアルゴリズムのための可能な、と即座に私たちのアプリケーションを圧倒。
スマート友人が実際には、問題は、我々の統計精度が低すぎるという理由だけで、見ている可能性があります。だから、どのように我々はそれがうまく、この問題に対処するのですか?それとも、それはどのように削減の重要な問題に影響を与えるのでしょうか?我々は、次のスライディングウィンドウアルゴリズムを見ることができます。
スライディングウィンドウ
ウィンドウをスライディング、また、ローリング・ウィンドウとして知られています。この問題を解決するために、我々は、スライディングウィンドウアルゴリズムを紹介します。TCPネットワークプロトコルを研究した場合、確かにスライディングウィンドウの期間は不慣れではありません。この図の下に、スライディングウィンドウアルゴリズムの良い説明:
図では、赤い長方形は、私たちの例では、時間ウィンドウが1分で、全体の時間ウィンドウを示します。我々は、次に、各セルは10秒で表されるように、我々は、指定されたスライディングウィンドウ枠6となるであろう、そのような図面として、時間ウィンドウを分割します。10秒ごとには、私たちの時間ウィンドウは、右の1つのスペースにスライドさせます。各グリッドは、このような要求は午後12時35秒のときのように独自の個別カウンタカウンターを持っているに達したとき、0:30〜午後12時39分対応するカウンタが1増加されます。
それでは、どのようちょうど行うスライディングウィンドウの重大な問題を解決するには?私たちは空想図、0はすることができます:灰色のグリッドを到着59の100要求が落ちる、と要求が到達するに午前1時オレンジ色のグリッドを分類されます。時間1:00に達したときに、我々は、この時点で、窓枠の右側に200の合計の時間ウィンドウ内の要求の総数を移動し、100は、限界を超えるので、この場合には、トリガ電流制限を検出することが可能です。
私は再びちょうどカウンターのアルゴリズムを見て、私たちは実際には、カウンタアルゴリズムはウィンドウアルゴリズムをスライディング、それを見ることができます。それはちょうど、さらに時間の窓、これだけ1つのグリッドを分割しません。
よりグリッドがスライディングウィンドウ分割するときよりスライディングウィンドウをスクロール滑らかしたがって、、、統計を制限することは、より正確であろう。
リーキーバケットアルゴリズム
また、リーキーバケットとして知られるリーキーバケットアルゴリズム、。リーキーバケットアルゴリズムを理解するために、我々は、アルゴリズムの図を見てください:
私たちは、全体のアルゴリズムは実際には非常に簡単である、図から見ることができます。まず第一に、私たちは水が外に水にそこにある、固定筒能力を持っています。入ってくる水の流れのために、私たちが流れますどのくらいの水の合計を期待することはできません、水の流れを加速すると期待することはできません。水が流れ出るためしかし、この流量は、浴槽を固定することができます。バケツがいっぱいになったときまた、過剰な水は、オーバーフローします。
私たちは、リーキーバケットアルゴリズムは、本質的要求の速度を制限されて見ることができ、アルゴリズムの実用化に水を要求します。リーキーバケットアルゴリズムを使用している場合、我々は、インタフェースが要求を処理するために一定速度率になるようにすることができます。だから、リーキーバケットアルゴリズムの重要な問題は、自然に発生しません。具体的に次の擬似コード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{クラスLeakyDemoパブリック パブリックロングtimeStampに= getNowTime(); 公共int型の容量; //バケット容量 公共int型の割合; //漏水率 公共int型の水; //水流(リクエストの現在の累積数) 公共ブールグラント() { ロングgetNowTime = NOW(); 水= MAX(0、水- (今- timeStampに)*レート); //最初の水漏れ、残りの水を計算する 今タイムスタンプ=; IF((水+ 1)<容量。){ / /下の水、さらに水を追加しよう 。水+ = 1 ;真への復帰を } {他 、水の//は完全に水ゴミ追加 偽に戻ります; } } } |
トークンバケットアルゴリズム
また、トークンバケットとして知られているトークンバケットアルゴリズム、。このアルゴリズムを理解するために、我々は、アルゴリズムの図を見てください:
私たちは、図から見ることができ、トークンバケットアルゴリズムは、リーキーバケットアルゴリズムよりも少し複雑です。まず第一に、我々は、固定容量のバケットが、バケットはトークン(トークン)を保持しています。バケットを開始すると、空である、バケット内のトークンrは余剰トークンは廃棄され、バケツの容量になるまで一定の割合で充填されます。要求が終わったときはいつでも、それはトークンではない、それは要求によりできない場合は、バケットからトークンを削除しようとします。
具体的に次の擬似コード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class TokenBucketDemo { public long timeStamp = getNowTime(); public int capacity; // 桶的容量 public int rate; // 令牌放入速度 public int tokens; // 当前令牌数量 public boolean grant() { long now = getNowTime(); // 先添加令牌 tokens = min(capacity, tokens + (now - timeStamp) * rate); timeStamp = now; if (tokens < 1) { // 若不到1个令牌,则拒绝 return false; } else { // 还有令牌,领取令牌 tokens -= 1; return true; } } } |
相关变种
若仔细研究算法,我们会发现我们默认从桶里移除令牌是不需要耗费时间的。如果给移除令牌设置一个延时时间,那么实际上又采用了漏桶算法的思路。Google的guava库下的SmoothWarmingUp
类就采用了这个思路。
临界问题
私たちは、重要なシーンの問題を考えてみましょう。0:59秒、瞬時によってトークンので、この要求100が充填されたバレル100からです。しかし、トークンため、トークンバケットの数100を達成することができない場合1:00、この時点で、もはや要求を通じて100が存在しないのでことを、より低いレートで満たされています。そのため、トークンバケットアルゴリズムは、重要な問題を解決することができます。下のグラフは、臨界点の変化率でカウンター(左)と、トークンバケットアルゴリズム(右)を比較します。私たちは、トークンバケットアルゴリズムは、バーストレートを可能にしながら、ことがわかりますが、トークンバケットが発生するのに十分なを持っているため、バースト・レートで待機する必要があります。
概要
VSは、カウンタウィンドウをスライディング
カウンタアルゴリズムは、ウィンドウの実装を摺動低精度とみなすことができ、最も簡単なアルゴリズムです。カウンタ部(各グリッド預金)の複数を記憶する必要性にスライディングウィンドウ、スライディングウィンドウは、実現に多くの記憶空間を必要とします。これは、より正確なスライディングウィンドウ場合は、ストレージスペースの必要性も大きいです。
リーキーバケットアルゴリズムVSトークンバケットアルゴリズム
リーキーバケットアルゴリズムと最も明白な違いアルゴリズムトークンバケットは、トークンバケットアルゴリズムは、トラフィックバーストある程度のを可能にすることです。デフォルトのトークンバケットアルゴリズムは、バレルがトークン100を想定した場合には、トークンの時間のかかる除去を必要としないので、その後、100が瞬時に通過を許可することができます要求します。
トークンバケットアルゴリズムは簡単で、トラフィックのいくつかのバーストを可能にするので、ユーザーフレンドリーなので、業界では、より多くの土地を使用しています。もちろん、我々は特定の条件を必要とし、唯一の最も適切なアルゴリズムは、最適なアルゴリズムではありません。