図1に示すように、高い同時実行処理
1.1高同時治療の選択肢:
缓存
キャッシュの目的は、アクセス速度及びシステム容量の増加システム処理を強化することです降级
サービスは、問題を格下げやコアプロセスに影響を与えている場合は、一時的にマスクされた、または問題がオープンするピークの後に解決するために限流
電流制限の目的は、同時アクセスによって保護されている/レート要求、または時間ウィンドウシステム速度内の要求を制限、レート制限は、サービスが拒否される可能性が一度に達し、またはキューを待っている、処理降格
1,2限定的に:MQ、ratelimiter
2は、ratelimiterは、トークンバケットアルゴリズムに基づいて行われます
トークンバケットアルゴリズムが使用されRateLimiterグアバは、それが、例えば第10のトークンは、実際のトラフィック要求にそれぞれ応答する前に、トークンバケットから取得し、トークンバケットに固定された周波数に配置されますすぐに失敗を返すためにブロックは、トークンを待っているか失敗:唯一のトークンの要求は、次の2つの方法で得られた正常な応答であることがかかります
また、銅ドレイン簡潔化アルゴリズム:
要求されたスピード>オーバーフロー処理要求率は、リーキーバケットアルゴリズムを強制的に要求レートを扱うことができるならば、一定の速度でリーキーバケットに要求します。しかし、高い並行性処理におけるこのようなスキーム、多数の要求に突然不適切
トークンバケットコード:(作成):毎秒トークンの数を作成します
tryacquireは():トークンを取得しようと、tryacquire():買収はすぐに戻り未満の場合は、トークンを取得しよう。tryacquire(int型の許可、長いタイムアウト、TimeUnitで単位):買収は待つことができない場合は、トークンの許可を得るための試みタイムアウト時間
・コアアルゴリズム:
パッケージcom.leolztang.sb.aop.ratelimiter。 輸入org.springframework.stereotype.Service。 輸入com.google.common.util.concurrent.RateLimiter。 @Service パブリック クラスAccessLimitService { RateLimiter rateLimiter = RateLimiter.create(100.0 )。 // 尝试获取令牌 パブリック ブールtryAcquire(){ 戻り)(rateLimiter.tryAcquireします。 } }
テストカテゴリ:
パッケージcom.leolztang.sb.aop.ratelimiter。 輸入java.text.SimpleDateFormatの。 輸入java.util.Date; 輸入java.util.concurrent.ExecutorService。 輸入java.util.concurrent.Executors。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Controller。 輸入org.springframework.web.bind.annotation.RequestMapping。 輸入org.springframework.web.bind.annotation.RequestMethod; 輸入org.springframework.web.bind.annotation.ResponseBody。 輸入org.springframework.web.bind.annotation.RestController。 @RestController @RequestMapping("/限度" ) パブリック クラスAccessLimiterController { プライベート 静的てSimpleDateFormatのSDF = 新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS" )。 ExecutorServiceのfixedThreadPool = Executors.newFixedThreadPool(120 )。 @Autowired プライベートAccessLimitService accessLimitService。 (値@RequestMapping = "/レート制限"、メソッド= RequestMethod.GET) @ResponseBody 公共 ボイドtryForVisitを(){ ため(int型 I <200; iは++ iは= 0){ fixedThreadPool.execute(新しい e.printStackTrace();実行可能な(){ @Override 公共 ボイドラン(){ 文字列str = visitAccess()。 System.out.println( "出力:" + STR); } })。 } } パブリック文字列visitAccess(){ 場合(accessLimitService.tryAcquire()){ 試みる{ のThread.sleep( 2000 )。 } キャッチ(InterruptedExceptionある電子){ } 新戻り "aceess成功[" + sdf.format(日付())+ "]" 。 } 他{ リターン "aceessリミット[" + sdf.format(新しい日付())+ "]" 。 } } }
ポンポン依存ファイルは、グアバを導入しました:
<依存>
<groupIdを> com.google.guava </ groupIdを>
<たartifactId>グアバ</たartifactId>
<バージョン> 18.0 </バージョン>
</依存関係>
3、