電流制限アルゴリズムを理解すれば十分です。

電流制限アルゴリズムを理解すれば十分です。

TL;DR (長すぎるので読まないでください)

現在の制限アルゴリズム: カウンター、スライディング ウィンドウ、リーキー バケット、トークン バケット。

電流制限ソリューション: Guava の RateLimiter、Alibaba Sentinel

[[273634]]

周知のとおり、同時実行性の高いビジネス シナリオでは、サービスの安定性を確保するために、キャッシュ、サーキット ブレーカーの劣化、サービス電流制限という 3 つの主要な手段がよく使用されます。

コアとなる自己保護メカニズムとして、サービス電流制限は、同時実行性が非常に高い場合に他のメカニズムで劣化を保証できない場合に、システムがクラッシュしてアバランシェ効果が発生するのを防ぐことができます。

そのようなシナリオを想像してみましょう。

名詞解析、QPS(1秒あたりのクエリ数)

1 台のマシンが耐えられる最大 QPS は 100 です。マシンは 5 台あり、1 日のサービス QPS は 300 です。

したがって、実際にはまったく負荷がかからず、フロント ロード バランシング サーバーによれば、各サーバーは 300/5 = 60 です。完璧なサービスを提供できます。

今日、上司が突然プロモーションを開始し、QPSが800に達しました。

さて、マシン A の QPS が 160 に達したため、完全に圧倒され、すぐにクラッシュしました。この時点で、クラスター内に残っているマシンは 4 台のみで、QPS は依然として 800 です。残りの 4 台のマシンに均等に分配し、各マシンに 200 個ずつ分配します。まさにそのようにして、機械が次々と倒れ、雪崩が起こりました。

では、システムの流れが制限されていたら何が起こるでしょうか?

QPSが800に達しました。マシン A の QPS は 160 に達しましたが、フローが 100 に制限されているため、マシンは正常に動作しています。60 QPS の顧客が失われるだけで、クラスター全体は正常に動作しています。これにより、開発者とオペレーターは容量のダウングレードと拡張を開始する時間ができます。

電流制限はシステムの自己保護にとって非常に重要であることがわかります。しかし、多くのエンジニアはこれを真剣に受け止めていないか、その背後にある原理を知らずに使い方を知っているだけです。まず結論を述べさせてください。

一般的な電流制限アルゴリズムには、カウンター、スライディング ウィンドウ、リーキー バケット、トークン バケットなどがあります。

一般的な電流制限ソリューションには、GuavaのRateLimiter、分散ロックベースのトークンバケット、Alibaba Sentinelなどがあります。

<カウンター>

一般的に言えば、カウンターは比較的大まかで、単位時間あたりに受信される QPS リクエストの数を確認するためのものです。しきい値を超えると、サービスは直接拒否されます。おそらくこの光景はこんな感じです。

パンケーキの屋台があり、オーナーはラオ・ワンと呼ばれ、ボスは1分間にパンケーキを6枚しか販売できない(カウント制限は1分間に6枚)と言っています。最初の 0.1 秒で誰かがすでに 6 個のケーキを予約していて、老王がインスピレーションを終えたばかりの場合、老王は次の 59.59 秒間椅子に座って、次の 1 分が来るのを待つだけです。

システムのパフォーマンスが許せば、単純で粗雑なカウンターは多くのリソースを無駄にする可能性があります。

<スライディングウィンドウ>

スライディング ウィンドウは、カウンターの洗練された実装と見ることができます。以前は、一度に 1 分しか進むことができませんでしたが、実装の改良により、今では一度に 1 秒進むことができます。ただし、全体的な原理は依然としてカウンターに依存しています。 「過ぎたことは忘れよう」は、適切なタイミングで忘れる方法を教えてくれるカウンターです。

<漏れるバケツ>

この図を見ると、リーキー バケットの基本原理がわかります。バケットをバッファとして使用し、すべてのリクエストは最初にバケットにスローされます。システムはこれらのリクエストを一定の速度でゆっくりと処理します。より一般的な実装はキューです。キューでは、バッファを使用して未処理のリクエストを保存し、コンシューマーは一定の速度でいくつかのリクエストを取得して処理します。

パンケーキの屋台があります。店主はラオ・ワンといいます。ラオ・ワンは1秒間にパンケーキを1枚しか作れません。今、お客さんが100人います。どうしたらいいですか? 列に並びましょう。ラオ・ワンさんの妻パンさんは、客のグループを近くの空き地まで案内し、一人ずつ番号を記した。ラオ・ワンさんがケーキを作り終えると、番号を叫ぶと、該当する客がケーキを受け取りにやって来た。

ここで要件を確認してください。スペース(バケット)があり、顧客が待つことができる必要があります(待ち時間)。

<トークンバケット>

特定の戦略に従ってトークンをトークン バケットに入れるトークン マネージャーが存在します。システムはリクエストを受信するたびにトークンを要求します。トークンが取得された場合、リクエストは処理されます。取得されなかった場合、リクエストは直接拒否されます。トークン発行戦略が正しければ、システムは低下せず、マシンの利用率は高くなります。

パンケーキの屋台があります。店主はラオ・ワンという人で、パンケーキを何枚作れるかさえ分かっていません。老王の妻の阿潘は、老王の横にバケツを置き、その中にトークンをいくつか入れて、老王に言いました。「私が見張っておくわ。トークンを見つけたら、それをやってごらん。」 今では 100 人の客が来ており、老王は壁に塗るために肥料を掘っています。以前は 1 秒に 1 つしかできませんでしたが、今では 1 秒に複数回できます。老王はもう客を見ず、トークンが手に入るたびにそれを行います。老王さんの妻パンさんは、老王さんの手が震えていないか、トイレに行きたいのかを確かめるために、老王さんをずっと見ていた。手が震えたり、もう耐えられない場合は、トークンをいくつか入れて休憩してください。しかし、一度に 5 人の VIP 顧客が来た場合、Apan はそれほど気にせず、Lao Wang を忙しくさせるためにさらに数枚のトークンを投げるだけです。

トークン バケット方式では、システムの負荷に応じてシステムの処理能力をリアルタイムで調整でき、一定量の瞬間的なピーク トラフィックを迅速に処理できることがわかります。

わかった。スキームとアルゴリズムについては基本的に説明しました。次に、電流制限の既存の実装について説明します。もちろん、あまり開発せずにすぐに使用できることを強く望んでいます。幸いなことに、すでに多くのオープンソース実装があるため、自分で実装するのは特に難しいことではありません。

<レートリミッター>

  1. <依存関係>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>グアバ</artifactId>
  4. <バージョン>25.1-jre</バージョン>
  5. </依存関係>

電流制限制御には Guava の RateLimiter を使用します。主なコア モードには SmoothBursty と SmoothWarmingUp の 2 つがあります。 SmoothBursty は 1 秒あたり N 個のトークンを発行し、また、一定数のトークンを事前に借りることもできます。 SmoothWarmingUp では、システムの起動直後は最小しきい値に従ってのみトークンが発行され、その後、設定された最大しきい値まで徐々に増加します。

  1. レートリミッターのスムーズなBuisty = RateLimiter.create ( 1 );
  2. RateLimiter の SmoothWarmingUp をRateLimiter.create (1, 1, TimeUnit.SECONDS);
  3. スムーズなBuistyを取得します。
  4. スムーズウォーミングアップを取得します(5);

acquire() メソッドはトークン バケットが返されるまでブロックされ、一度に N 個のトークンを取得できます。ただし、RateLimiter はスタンドアロン版です。分散実装を実現したい場合は、RateLimiter の原理に基づいて次の分散実装を実装し、Redis などの分散ロックを使用して実現できます。

<アリババセンチネル>

https://github.com/alibaba/Sentinel.git

Sentinel は、構成センターを備えた分散キャッシュです。統計ポイントとして「リソース名」を使用し、さまざまな電流制限ソリューションを提供します。QPS、スレッド数、さらにはシステム負荷に基づいて、クラスター規模の電流を制限できます。これがエコシステム全体における Sentinel の位置づけです。

電流制限を使用するコードは非常にシンプルです。一意の識別子として文字列型のリソースを定義するだけで、Sentinel がルールに従って電流を制限します。

  1. 試してください (エントリ entry = SphU.entry( "HelloWorld" )) {
  2. // ここにビジネス ロジックを記述します。
  3. System.out.println ( "hello world" ) ;
  4. } キャッチ (BlockException e) {
  5. // 拒否されたリクエストを処理します。
  6. e.printStackTrace();
  7. }

電流制限ルールを定義するコードも非常にシンプルです。一意の識別子として文字列型のリソースを定義するだけで、Sentinel がルールに従って電流を制限します。

  1. プライベート静的void initFlowRules(){
  2. リスト<FlowRule> ルール = 新しい ArrayList<>();
  3. フロールールルール= 新しいフロールール();
  4. ルール.setResource( "HelloWorld" );
  5. ルール.setGrade(RuleConstant.FLOW_GRADE_QPS);
  6. //制限 QPS を20設定します
  7. ルール.setCount(20);
  8. ルールを追加します(ルール)
  9. FlowRuleManager.loadRules(ルール);
  10. }

リアルタイムのルール調整のためのダッシュボードも提供されます。

最後に、今日の結論をまとめましょう

現在の制限アルゴリズム: カウンター、スライディング ウィンドウ、リーキー バケット、トークン バケット。

現在の制限ソリューション: Guava の RateLimiter、分散ロックベースのトークン バケット、Alibaba Sentinel

<<:  Golang GC についていくつか誤解がありますが、本当に Java アルゴリズムよりも高度なのでしょうか?

>>:  AI が電子商取引におけるウェブサイト アクセシビリティ訴訟のリスクを最小限に抑える方法

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

AIが機密情報を保護する5つの方法

人工知能(AI)は、業務の効率化に欠かせないツールであるだけでなく、機密情報の保護にも重要な役割を果...

...

Fooocus: シンプルで強力な安定した拡散 WebUI

Stable Diffusion は強力な画像生成 AI モデルですが、通常は多くのチューニングと...

GNN の科学: テンセント AI ラボと清華大学が、等変グラフ ニューラル ネットワークをレビューする論文を共同で発表

近年、伝統的な自然科学の問題の解決においてますます多くの人工知能手法が活躍しており、いくつかの重要な...

...

自分でゴミを分別できるスマートゴミ箱が登場するまで、どれくらい時間がかかるのでしょうか?

あなたの市では今日から「ゴミの分別」が始まりましたか?上海が先導して実証を進め、北京、天津、重慶、成...

Amazon Web Services は、5 つのステップで企業の生成 AI の実現を支援します。

アマゾンのCEO、アンディ・ジャシー氏はかつて、アマゾン ウェブ サービスの目標は、誰もが大企業と同...

...

将来、ロボットがあなたの仕事を奪うでしょうか?慌てずに専門家の言うことに耳を傾けましょう

[[384941]]スペインの新聞「エル・エコノミスタ」は最近、ラモン・オリバー氏による「仕事の自動...

独自のデータを使ってシンプルな畳み込みニューラルネットワークを構築する

この記事では、花、車、猫、馬、人、自転車、犬の 7 種類の何千もの画像でトレーニングされ、特定の画像...

OpenAI の組み込み検索は本当に便利ですか?定量的な評価により、より深い理解が得られます。

ベクターデータベースの強力なライバルが登場するか?トラック関連のスタートアップ企業がまたもや倒産しそ...

オープンソースのビデオ切り抜き技術が人気です!背景を変える方法は、それが真実か嘘かを判断するのが非常に難しい

グリーンスクリーンは、映画やテレビドラマで画像を切り取ったり背景を変えたりするのに強力なツールですが...

屋台経済は活況を呈している!ロボットも問題を抱えている

「働いてお金を稼ぐのは大変すぎるから、屋台を出して自分で経営者になったほうがいいよ!」露店経済の突然...

人工知能が高等教育を支援する:変化と持続

[[434825]]人工知能が教育に浸透する中で、我々は「静をもって動を制御する」という決意を持ち、...

データ分布の正規性を判断するための11の基本的方法

データ サイエンスと機械学習の分野では、多くのモデルはデータが正規分布していると想定しているか、デー...