1はじめに
ホットスポットとは何ですか?热点即经常访问的数据
。多くの場合、特定のホットスポットデータでアクセス頻度が最も高い上位Kデータをカウントし、そのデータへのアクセスを制限する必要があります。といった:
- 商品IDはパラメータであり、一定期間に最も頻繁に購入された商品IDをカウントして制限します
- ユーザーIDはパラメーターであり、一定期間内に頻繁にアクセスされるユーザーIDを制限します。
ホットスポットパラメータの電流制限は、着信パラメータのホットスポットパラメータをカウントし、設定された電流制限のしきい値とモードに従って、ホットスポットパラメータを含むリソース呼び出しが制限されます。ホットスポットパラメータの電流制限は、特別な種類のフロー制御と見なすことができます。これは、ホットスポットパラメータを含むリソース呼び出しに対してのみ有効です。
Sentinelは、LRU
戦略を使用して最も頻繁にアクセスされるホットスポットパラメータをカウントし、トークンバケットアルゴリズムを組み合わせてパラメータレベルのフロー制御を実行します。ホットスポットパラメータの電流制限は、クラスターモードをサポートします。
2.ホットスポットパラメータルール
ホットパラメータルール(ParamFlowRule
)は、トラフィック制御ルール(FlowRule
)に似ています
属性 | 説明 | デフォルト |
---|---|---|
資源 | リソース名、必須 | |
カウント | 電流制限しきい値、必須 | |
グレード | 電流制限モード | QPSモード |
durationInSec | 統計ウィンドウの長さ(秒単位)、モードはバージョン1.6.0以降でサポートされています | 1秒 |
controlBehavior | フロー制御効果(高速障害と均一速度キューイングモードをサポート)、バージョン1.6.0のサポートを開始 | 早く失敗する |
maxQueueingTimeMs | バージョン1.6.0でサポートされている、キューイングの最大待機時間(均一速度キューイングモードでのみ有効) | 0ms |
paramIdx | インデックスホットパラメータが必要です。SphU.entry(xxx, args) インデックス位置の対応するパラメータ |
|
paramFlowItemList | パラメータ例外の場合、現在の制限しきい値は、指定されたパラメータ値に対して個別に設定でき、以前のカウントしきい値によって制限されません。基本タイプと文字列タイプのみがサポートされています | |
clusterMode | クラスターパラメーターフロー制御ルールかどうか | false |
clusterConfig | クラスターフロー制御関連の構成 |
3.ホットスポットパラメータの電流制限の場合
ホットパラメータの電流制限とは何かをすでに理解しています。次の例は、設定方法とSentinelが電流を制限する方法を示しています。
[A]次のメソッドをコントロールレイヤーに追加します
package com.bruce.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @BelongsProject: springcloud-alibaba-nacos
* @BelongsPackage: com.bruce.controller
* @CreateTime: 2021-02-20 17:19
* @Description: TODO
*/
@RestController
@Slf4j
public class HotKeyRuleController {
/**
* @SentinelResource: 指定资源名称,作用与HystrixCommand大体一致
* blockHandler: 指定降级处理方法,类似于Hystrix的fallbackMethod兜底方法
*/
@GetMapping("/testHotKeyRule")
@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")
public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password) {
return "[热点限流规则]testHotKeyRule..";
}
public String testHotKeyRule_blockHandler(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password,
BlockException exception) {
return "[热点限流规则-兜底方法]testHotKeyRule_blockHandler..";
}
}
プロジェクトを再起動し、ブラウザにアクセスします。http:// localhost:8401 / testHotKeyRule
は、インターフェイスが接続されていることを示しています。設定方法を見てみましょう。
[B] Sentinelホットスポット電流制限構成。具体的な構成は、上の図に示す
とおりです。上記の構成はtestHotKeyRule
、リソースにアクセスするときtestHotKeyRule
に、メソッドの最初のパラメーターの要求[ここではコントローラーのユーザー名パラメーターに対応します]を示します。リクエストが1秒以内に行われた場合しきい値QPSが1回を超えると、ボトミングメソッドがトリガーされます。
ブラウザアクセス:http://127.0.0.1:8401 / testHotKeyRule?username = bruce
現時点では、1秒以内に1回アクセスしていることに注意してください。インターフェースがデータを正常に返すことがわかります。
突然、インターフェースをリクエストする頻度を増やし、1秒以内にリクエスト数を手動で複数回トリガー
しました。上記の構成リクエストルールに違反すると、ダウングレードプロセスがすぐに実行され、blockHandlerが実行されることがわかります。指定したメソッドは正常に実行されます。
以下にアクセスします:http:// localhost:8401 / testHotKeyRule?password = 123456、このリクエストには、1秒に1回リクエストするか、1秒に1回リクエストするかに関係なく、パラメータインデックスが0のSentinel構成のパラメータ[username]が含まれないことに注意してください。 2番目のリソース内でクレイジーなリクエストを行う:
リクエストインターフェイスに指定された現在の制限キーが含まれていない場合、blockHandlerメソッドはトリガーされないことがわかります。
4.ホットスポット電流制限-パラメータ例外項目
以前、ホットパラメータの電流制限の通常バージョンを導入しました。最初のパラメータが1秒間に複数回アクセスされると、しきい値1に達した直後に制限されます。ただし、電流制限パラメータのキーが特定であると予想される場合があります。値。特別な値の場合、現在の制限値は通常と同じではありません。したがってSentinel
、この特別な要件を満たすために、パラメータ例外項目の構成が提供されます。
例:最初のパラメーターusername = bruceの場合、そのしきい値は500に達する可能性があります。
[A] Sentinelパラメーター例外構成
[b]テスト
ブラウザのクレイジーな訪問:http:// localhost:8401 / testHotKeyRule?username = bruce123
パラメータの値が例外項目構成の値を満たさない場合でも、デフォルトで通常の電流制限が引き続き使用されていることがわかります[1秒に1回以上の直後に劣化]。
以下では、パラメーターの例外をテストします:http:// localhost:8401 / testHotKeyRule?username = bruce
パラメータ値が「bruce」に等しいときに以前に設定したため、QPSしきい値は500です。したがって、ブラウザで更新を続けると、基本的に1秒間に500のアクセスしきい値を超えることはできません。トリガーされました。ダウングレードメソッド。下の図に示すように、
特別な注意が必要な場所について話しましょう。ビジネスメソッドの例外をシミュレートします。
@GetMapping("/testHotKeyRule")
@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")
public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password) {
int i = 10 / 0;
return "[热点限流规则]testHotKeyRule..";
}
プロジェクトを再起動し、ブラウザにアクセスします:http:// localhost:8401 / testHotKeyRule?username = bruce、
除数が0のエラーレポートが直接表示され、ダウングレードされないことがわかります。実行しないでください。間違って、blockHandlerメソッドは、Sentinelで構成した現在の制限ルール専用です。これに違反すると、メソッドが劣化するために使用されます。ビジネスによってスローされた例外である場合、Sentinelは劣化しません。
簡単な要約:
@SentinelResource
:blockHandlerメソッド構成によって処理されるSentinelコンソール構成の違反に対処します。
RuntimeException
:Javaランタイムによってスローされたランタイム例外、@ SentinelResourceは気にしない、@ SentinelResourceマネージャー構成エラー、操作は異常になるか異常になるはずです。
5.まとめ
ホットスポットパラメータの電流制限ルールは、主に要求パラメータの統計に基づいており、電流制限を実現します。まず、ホットスポットパラメータはQPS統計に基づいています。パラメータインデックスが0に設定されている場合、最初のパラメータ統計が優先されます。しきい値も基本パラメータのしきい値に従って制御されますが、追加のパラメータリストの添え字は次のとおりです。指定した場合は、指定したホットスポットパラメータの値を指定する必要があります。現在アクセスしているパラメータがプリセットパラメータと一致しない場合でも、最初のパラメータのしきい値が優先されます。