RateLimiter限流

図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、

おすすめ

転載: www.cnblogs.com/enhance/p/11201190.html