1.アルゴリズム
高い同時実行のアプリケーションでは、電流制限は、トピックの周りに開いていません。私たちのAPIを制限すると、ネットワーク攻撃を防ぐことができ、すべてのユーザーに対してサービスの可用性を保証することができます。
通常、高並行システムの開発が制限共通に有する:時間窓の範囲内、同時一過(瞬時同時接続数を制限することを意図するもので、例えばnginxのlimit_connモジュール)の数を制限するために、(例えば、データベース接続プール、スレッドプールなど)の同時の総数を制限します(秒あたりの平均速度を制限するようなグアバのRateLimiter、nginxののlimit_reqモジュールなどの)平均速度等のリモートインタフェースコールレート、MQ制限消費率のような他の制限が存在します。また、流量制限に従って、ネットワーク接続、ネットワーク・トラフィック、CPU、または他のメモリ負荷であってもよいです。
制限アルゴリズム
あなたは正確にTPSを制御したい場合は、リストリクタ(レート制限/スロットリング)は、離れて、単純な制御の同時実行性から、最も簡単な方法は、そのような単位の時間が経過した決定として、時間単位でカウンターを維持することであるか、そしてカウンターをゼロにリセットします。この方法は、そのような二回2ミリ秒以内の場所である1秒の最後のミリ秒と、それは要求の最大数をトリガ次の第二の元最初のミリ秒、として、何も良い境界処理単位時間と見なされていませんTPS。
リーキーバケットアルゴリズムとトークンバケットアルゴリズム:一般的に使用されるアルゴリズムより滑らかな流れ制限器は、二つを有しています。このよう華為、ZTEなどの多くの伝統的なサービスプロバイダが同様の特許を、参照持つ流量制限のパケットトークンバケットのための方法を。
リーキーバケットアルゴリズム
リーキーバケット(漏出バケット)アルゴリズムは、最初のバケットにドレインに非常にシンプルなアイデア、水(リクエスト)、一定速度(インターフェースに応答速度)でバケット水、流入速度、水が直接アセンブリを通ってオーバーフロー(インタフェースを介したアクセス周波数応答であります率)、その要求を拒否し、それを見ることができるリーキーバケットアルゴリズムは、データ伝送速度に制限を課すことができます。
2つの変数が見ることができますがありますが、それは、トラフィックのサポートが急激に増加し、他のバケットの脆弱性(率)の大きさであるとき、水(バースト)を保存することができますどのくらい、バレルの大きさです。リーキーバケットパラメータのリークレートが固定されているので、(輻輳が発生していない)ネットワーク・リソースの競合が存在しない場合でも、その結果、ポートはないリーキーバケット流量バースト(バースト)にすることができます。したがって、リーキーバケットアルゴリズムは、トラフィックのバースト性であるの存在のために非効率的です。
トークンバケットアルゴリズム
トークンバケットアルゴリズム(トークンバケット)と反対の効果リーキーバケットアルゴリズムと同じ方向に、より容易に理解されます。バケットがトークン(水道水に一定の増加が存在し、逆漏れや抜け穴を想像)を加えに、バケットが満杯である場合(QPS = 100は、間隔が10msである場合)、時間が経つにつれて、システムは、定数1 / QPS時間間隔になりますプラスではありません。新しいリクエストが来るそれはトークンを取っていない場合は、各トークンがかかります、ブロックされたか、サービス拒否することができます。
追加の利点は、簡単に速度を変更することができますトークンバケットです。率を高めるために必要ならば、需要増のトークンバケットレートが置か。一般的に、タイミング(例えば100ミリ秒)は、トークンの特定の数、いくつかの亜種は、計算トークンを増やす必要があり、リアルタイムのアルゴリズムの数に浴槽を増加させました。RateLimiterでグアバは、トークンバケットアルゴリズムのデザインのアイデアを使用して参照してください RateLimiterで設計されており、理由はどう?、詳細なアルゴリズムを参照してくださいソースコードを。
この記事では、統合ゲートウェイの実装について説明します
2.ゲートウェイプロジェクトを作成します。
詳細については、以下を参照してください。春クラウドゲートウェイのゲートウェイを
で、これに基づいてポンポンを追加します
<! - RequestRateLimiter限流- > < 依存> < groupIdを> org.springframework.boot </ groupIdを> < たartifactId >春・ブート・スターター・データ・Redisの反応性</ たartifactId > </ 依存関係>
3. Configureクラス
パッケージcom.common.config。 輸入org.springframework.beans.factory.annotation.Qualifier; 輸入org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.context.annotation.Primary; 輸入reactor.core.publisher.Mono; / ** * @Title: * @Auther: * @Date:2019年8月28日夜05時13分 * @Version:1.0 * @description: * / @Configuration パブリック クラスRequestRateLimiterConfig { @Bean @Primary KeyResolver apiKeyResolver(){ // 按URL限流 リターン為替- > Mono.just(。。exchange.getRequest()ある、getPath()のtoString()); } @Bean KeyResolver userKeyResolver(){ // 按用户限流 戻り交換- > Mono.just(exchange.getRequest()getQueryParams()getFirstと( "ユーザ"。。 )); } @Bean KeyResolver ipKeyResolver(){ // 按IP来限流 戻り交換- > Mono.just(exchange.getRequest()getRemoteAddress()のgethostname()); } }
4.yml設定
application.yml
春: ファイルアプリケーション: 名前:gateway8710 クラウド: ゲートウェイ: デフォルト - フィルタ: 路線: - ID:USER- サーバーの 述語: -パス= / Javaの/ ** フィルタ: - StripPrefix 1 =。 ビルトインのトークンのゲートウェイを使用して#絞りフィルタ、アルゴリズム -名:RequestRateLimiterの 引数: 第二のトークンバケット充填あたり#平均速度、すなわち、ラインは、毎秒の要求の平均数を処理するためにユーザを可能に相当する Redisの-limiter.replenishRateレート:10 #トークンバケット容量を可能にしますリクエストの数秒以内に完了したが、最大数 のRedis-レートlimiter.burstCapacity:20 制限のBeanオブジェクト・キーの名前のための#パーサ。これは、{のbeanName @}#に応じて容器からのSpeI発現豆スプリングオブジェクトを取得します。 リゾルバ・キー: "#@のapiKeyResolver {}" URI:LB:// -サービス- Helloword ":#URI http://192.168.111.133 :8708 /プロジェクト/こんにちは" のRedis: #Redis索引データベース(デフォルト0) のデータベース:0 #接続時間(ミリ秒)は、パラメータのタイプが時間である場合、単位設定、それが指定されなければならないspringboot2.0 20S:タイムアウト #パスワードの パスワード:テスト クラスタ: #最大取得失敗リダイレクト MAX-リダイレクト:3 #テスト環境のRedis ノード: - 10.0.0.1:6380 - 10.0.0.2:6380 - 10.0.0.3:6380 - 10.0.0.1:6381 - 10.0.0.2:6381 - 10.0.0.3:6381 レタス: プール: #接続プールの最大接続数(負の値制限なし) MAX-アクティブ:300 レイテンシ接続プールをブロック#最大値(負の値制限なし) MAX-ウエイト:-1,2 #接続プール最大アイドル接続 MAX-アイドル:100 #最小接続プールアイドル接続 分間アイドル:20 サーバ: ポート:8710 ユーレカ: クライアント: のserviceURL: #登録センターへ defaultzone:http://192.168.111.133 :8888 /ユーレカ/ インスタンス: #間隔1Sは、彼らはまだ「生きている」であることを証明し、心拍一度サーバに送信される リース・リニューアル・インターバル・イン・秒:1つの 私は2秒以内に、それは私の「死」に代わって、あなたの心を与えていない場合#は、サーバーを教え、私は追い出されます。 リース満了期間・イン・秒:2
次のようにディレクトリ構造があります
5. [スタート]テスト
JMeterは1秒以内に開始30の処理を繰り返し要求に1万回を送って、同時実行テストを行う必要があります。
試験結果は、10 / sのトークン要求を429のリターンをつかむない側を制限する平均要求に対応します