センチネル---スライディング ウィンドウの実装原理

Sentinel には、ダウングレード、電流制限、ホットスポットなどのさまざまなルールがあり、これらのルールには、単位時間あたりのリクエスト量がさまざまな条件を満たした後にさまざまなアクションを実行するという時間要素が含まれます。

ここでは、センチネルでのスライディング ウィンドウの実装を検討します。

 上記は引き違い窓の模式図です。

センチネルのスライディング ウィンドウの実装コードについて話すのはやめて、問題を明確に考えて、後でスライディング ウィンドウのコードを読むためのアイデアを整理しましょう。

 スライディングウィンドウを使用するとどのような問題が解決されますか?

スライディング ウィンドウを使用して、次のことを行います。時間単位でデータをカウントします。

時間単位ごとにカウントするには時間単位(1秒か100ミリ秒か)の定義が必要であり、統計データの場合はデータをロードするコンテナが必要であると同時に、データの急増を避けるため、特定の時間ノードを使用して統計誤差を削減します。また、「単位時間」をより小さな部分に分割する必要がある場合もあります

関係するクラス

com.alibaba.csp.sentinel.slots.statistic.base.LeapArray

LeapArray は、sentinel のスライディング タイム ウィンドウの基本クラスです。まず、このクラスのクラス定義を見てみましょう。

 3 つの基本プロパティと参照型が含まれます

このうち、windowLengthInMs、sampleCount、intervalInMs は、前述した単位時間と単位時間の切り出しに関係しており、配列はデータを格納するために使用され、単位時間内のデータ格納コンテナーに使用されます。

その中で、WindowWrap は、その名前が示すとおり、タイム ウィンドウ データのパッケージ化クラスです。

LeapArray のコンストラクター:

 上の 2 つの段落を読んだ後、次の仮定を立てます: 1000ms 以内のデータをカウントする必要がある 1000ms の単位時間を 2 つのセグメントに分割し、各セグメントが 500ms であり、各セグメントのデータがウィンドウラッパー。

その後、特定の時点で、保存する必要のあるデータが得られます。

1 タイムノードがどのタイムウィンドウに属するかを計算する必要があります (2 つの 500ms セグメント)

2 どの windowWrap が時間ノードに対応するかを計算する必要がある

上記 2 つの問題は、次の 2 つの方法で解決できます。 

次のことを想像してください: タイム ノードが 1001 に達すると、計算された開始位置 (calculateWindowStart メソッドで計算された) は 1000 になり、1002 の計算された開始位置も 1000 になります。同時に、1001 と 1002 で計算されたデータの配列内での位置 (calculateTimeIdx の結果) も同じで、両方とも 0 になります。

このことから、必要なキー データが上記の 2 つの方法で計算されていることを理解するのは難しくありません。タイム ウィンドウの開始位置 (ウィンドウの長さが同じであるため、終了位置も同じでなければなりません)、コンテナー時間窓に対応する

したがって、現在時刻ノードのデータと、現在時刻ノードでのデータを加算する計算方法を取得したい場合は、次のようになります。

まず、2 つのキー データを計算します: コンテナの添字: idx、時間ウィンドウの開始位置: windowStart

 コンテナー データがデータから削除されると、データは空になり、新しいコンテナーが作成され、配列に格納されます。もちろん、これには楽観的ロックの使用が含まれます。

 空ではなく、現在時刻が古いコンテナの実際の場所と同じ場合: イベント ノードと前の操作との時間差が 500 ミリ秒以内で、データの保存に同じコンテナが使用されます。

 現在の時間ノードが最後の操作時間ノードより 500 ミリ秒を超える (またはさらに長い) 場合は、コンテナー内の時間開始位置を変更し、コンテナーのデータをリセットします (悲観的ロックの使用を含みます)。

上記はセンチネルのスライディング タイム ウィンドウのコア ロジックです

現在の時間ノードが位置する 1 単位時間内のデータをカウントする必要がある場合:

 

つまり、現在時刻ノードのデータを取得する必要がある場合、配列内のデータを直接読み取り、配列内の windowWrap データの時間開始点と現在時刻の時間開始点が intervalInMs を超えていないかどうかを確認します。 (時間単位で)取り出す

コンテナにデータを追加する必要がある場合: LeayArray のサブクラス (OccupiableBucketLeapArray) に実装が見つかりました。

上記は、センチネルのスライディング タイム ウィンドウ実装のコア ロジックです。

おすすめ

転載: blog.csdn.net/qq_39203337/article/details/132165631