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

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

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 分野の技術を研...

...

AutoRLについてまだよく知らないという人は、オックスフォード大学、Google、その他の機関の12人以上の学者がレビューを書いています。

強化学習 (RL) とディープラーニングの組み合わせは、一連の印象的な結果をもたらし、(ディープ) ...

AIは40の言語を理解でき、15の言語で22の部門で1位を獲得しました。その背景には、中国チームの22年間の粘り強さがあります。

一気に15言語で22の1位を獲得!いや、もっとすごいのは、彼は40以上の言語を読んで理解できるという...

...

今後5年間の産業AIの8つの主要な発展トレンド

ChatGPT と生成型人工知能 (AI) が世間の注目を集めるようになり、突如として世界で最も議論...

GPT-4+Midjourney がコードなしで「Angry Pumpkin」を作成!実際の経験:閾値は低くなく、再現が難しい

市販の AI ツールを使えば、自分でコードを 1 行も書かずに完全な「Angry Birds」を作れ...

がん治療への新たな希望:AIが科学者の生きた人間の細胞の観察を向上

[[230060]]細胞生物学者と細胞研究者は、新しい細胞モデルツールを利用できるようになりました。...

人工知能と機械学習がスタートアップに与える影響

人工知能 (AI) と機械学習 (ML) は、スタートアップを含む複数の業界に革命をもたらしました。...

現実世界の複雑な課題を解決するための LLM+模倣学習: AI2 が SwiftSage を提案

GPT-4 などの大規模言語モデル (LLM) は多くの推論タスクで優れたパフォーマンスを発揮します...

...

Scikit-learn をご存知ですか?これらの機能をご存知ですか?

[[229302]]ビッグデータ概要編纂者: 王暁奇、大潔瓊、アイリーンScikit-learn ...

人工知能には関連する専門家の参加も必要です!これはより良く、より速くなります

機械にはハードウェアだけでなくソフトウェアもあります。ハードウェアには材料や電力の問題が必要ですが、...

Hugging FaceはLLM向けの新しいGitHubです

翻訳者 |李睿レビュー | Chonglou大規模言語モデル(LLM)は近年テクノロジー業界に旋風を...

AI、VR、ブロックチェーンにより、新しい時代は貧しい人々にとっての楽園となるのでしょうか?

今日の社会では貧困がまだ存在しています。 [[275832]]国連開発計画(UNDP)のデータによる...