クラウドネイティブシステムの弾力性モデル

クラウドネイティブシステムの弾力性モデル

[[410918]]

この記事はWeChatの公開アカウント「Lean Coder」から転載したもので、著者はXiaomajiaです。この記事を転載する場合は、Lean Coder の公開アカウントにご連絡ください。

概要

1. クラウドネイティブシステムの回復力パターン

  • 1.1 サービス障害による雪崩効果
  • 1.2 クラウド ネイティブ エラスティック リクエストに関する前回の質問への回答は?

2. 弾力性モード: 下流のリクエストメッセージに基づいて動作する

3. 短時間中断時の応答コード

4. ポリークラシック戦略

5. Golang サーキットブレーカーパターン

ドイツの哲学者ニーチェはかつてこう言いました。「私を殺さないものは私を強くする。」

01クラウドネイティブシステムの弾力性モデル

今回は、最近の仕事の経験も踏まえて、引き続きクラウドネイティブの弾力性モデル(スケールではなく回復力)についてお話しします。これは「現代のクラウドネイティブ設計コンセプト」への回答でもあります。

「分散アーキテクチャでは、サービス B がサービス A からのネットワーク要求に応答しない場合はどうなるでしょうか?

サービス C が一時的に利用できなくなり、C を呼び出す他のサービスがブロックされた場合はどうすればよいですか?

ネットワークの問題またはサービス自体の理由により、サービス B と C は時間内に応答できず、サービス A によって開始された要求はブロックされます (B と C が応答するまで)。このとき、大量のリクエストが殺到すると、サービス A のスレッドリソースが枯渇し、サービス A の処理性能に大きな影響が出てしまい、ダウンストリームが依存する外部クライアント/バックエンド srv にも影響が出てしまいます。

障害は広がり、連鎖反応を引き起こし、分散構造全体に壊滅的な結果をもたらします。これはサービス障害の「雪崩効果」です。

サービス B と C が利用できない場合、ダウンストリーム クライアント/バックエンド srv は何ができますか?

客観的に見ると、リクエストは失敗し、事前に決定された弾性戦略(再試行/回路切断)が実行されます。

02 エラスティックモード: ダウンストリームリクエストメッセージに基づく動作

レジリエンス モードとは、障害が発生してもシステムが正常な動作を維持する能力です。失敗を避けるのではなく、失敗を受け入れてそれに対処しようとすることです。

Polly は、開発者が流暢かつスレッドセーフな方法で回復力戦略を表現できるようにする、包括的な .NET 回復力および一時エラー処理ライブラリです。

戦略シナリオ行動
リトライジッタ/一時エラー、短時間で自動回復特定の操作における再試行動作の設定
サーキットブレーカー短期的には回復しそうにない障害が閾値を超えた場合、一定時間内に速やかに障害を起こさせる
タイムアウト発信者が応答を待つ時間を制限する
隔壁障害の伝播を防ぐために、操作を固定のリソースプールに制限する
キャッシュ自動ストレージ応答
隔壁失敗した場合の構造化された動作を定義する

一般的に、エラスティック ポリシーはさまざまな要求メッセージ (外部クライアント要求またはバックエンド サービス要求) に適用されます。

その目的は、一時的に利用できないサービス要求を補うことです。

03 短時間中断時の応答コード

HTTP ステータス コード理由
404 見つかりません
408 リクエストタイムアウト
429 2つの多くのリクエスト
502 不正なゲートウェイ
503 サービスは利用できません
504 ゲートウェイタイムアウト

正確で標準化された応答コードは、開発者ができるだけ早く障害を特定するのに役立ちます。

失敗戦略を実行するときは、失敗によって発生した操作のみを再試行し、403UnAuthorized を再試行しないなど、より対象を絞ることもできます。

04ポリーの定番戦略

  • 再試行: ネットワーク ジッタ/一時エラーに対して再試行戦略を実装できます (障害はすぐに回復すると予想されます)。
  • サーキットブレーカー: 無効な再試行による障害の伝播を回避するために、一定時間内に障害の数がしきい値に達すると、サーキットブレーカーが開きます (一定時間内の高速障害)。

同時にタイマーが起動し、ブレーカーは半開モードになります(少数の要求を発行し、要求が成功すると障害が修復されたとみなされ、ブレーカーは閉状態になり、障害カウンターがリセットされます)。

  1. services.AddHttpClient( "小さい" )
  2. //ダウングレード
  3. .AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(新しいHttpResponseMessage(),async b =>
  4. {
  5. // 1. ダウングレード印刷例外
  6. Console.WriteLine($ "サービスが低下し始めました。アップストリーム例外メッセージ: {b.Exception.Message}" );
  7. // 2. ダウングレード後のデータ
  8. b.Result.Content = new StringContent( "リクエストが多すぎます。後でもう一度お試しください" , Encoding.UTF8, "text/html" );
  9. b.Result.StatusCode = HttpStatusCode.TooManyRequests;
  10. Task.CompletedTask を待機します。
  11. }))
  12. //ヒューズ
  13. .AddPolicyHandler(ポリシー<HttpResponseMessage>.Handle<例外>()
  14. .サーキットブレーカー非同期(
  15. 3, // 回路ブレーカーが開くまでの障害回数
  16. TimeSpan.FromSeconds(20), // 回路ブレーカーを開く時間間隔
  17. (例: ts) => //ヒューズオープン
  18. {
  19. Console.WriteLine($ "サービス回路ブレーカーが開いています。例外メッセージ: {ex.Exception.Message}" );
  20. Console.WriteLine($ "サービス回路ブレーカーの開放時間: {ts.TotalSeconds}s" );
  21. },
  22. () => { Console.WriteLine($ "サービス回路ブレーカーがリセットされました" ); }, // サーキットブレーカーリセットイベント
  23. () => { Console.WriteLine($ "サービス回路ブレーカーが半分開いています (しばらく開いて、しばらく閉じています)" ); } // サーキットブレーカー半開イベント
  24. //リトライ
  25. .AddPolicyHandler(ポリシー<HttpResponseMessage>.Handle<Exception>().RetryAsync(3))
  26. // タイムアウト
  27. .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(2)));
  28.         

アプリケーションに複数の HTTP 呼び出しがある場合、上記の従来の記述方法に従うと、コードには多くの重複した無関係なビジネス コードが混在することになります。

バッチ HttpClient の弾力的な戦略をエレガントに実装する方法について考えます。

ここでは 2 つの方法を紹介します。

① Blog Parkの有名ブロガーEdisonchou: AOPフレームワークを使ってPollyを動的に織り込む

② 匿名の専門家が、リフレクションと構成を使用してPollyHttpClientServiceCollectionExtension拡張クラスを実装しました。これは、構成ファイルでHttpClientNameを指定することをサポートしています。

[[410921]]

05Golang サーキットブレーカー

  1. github.com/sony/gobreaker にアクセスしてください

func NewCircuitBreaker(st Settings) *CircuitBreaker 回路ブレーカー オブジェクトをインスタンス化します。パラメータは次のとおりです。

  1. 型設定構造体{
  2. 名前文字列
  3. MaxRequests uint32 #ハーフオープン状態で許可されるリクエストの最大数。デフォルト値は 0 で、1 つのリクエストが許可されます。
  4. 間隔時間.期間
  5. タイムアウト時間.期間 # 回路ブレーカーが半開状態になるまでの間隔。デフォルトは60秒です。
  6. ReadyToTrip func(counts Counts) bool # 状態を切り替えるロジック
  7. OnStateChange 関数(名前文字列、変更元状態、変更先状態)
  8. }

次の例は、Google Web サイトをリクエストするときに、失敗率が 60% に達すると、「オープン」状態に切り替わり、同時に 60 秒のタイマーが開始されることを示しています。 60 秒後、「半オープン」状態になります (1 つのリクエストを開始できるようになります)。成功した場合、回路ブレーカーは「閉」状態になります。失敗した場合は、「オープン」状態に戻り、60 秒のタイマーをリセットします。

  1. パッケージメイン
  2. 輸入 (
  3. 「fmt」  
  4. 「io/ioutil」  
  5. "ログ"  
  6. 「ネット/http」  
  7. 「github.com/sony/gobreaker」  
  8. var cb *gobreaker.CircuitBreaker
  9. 関数init() {
  10. var st gobreaker.設定
  11. st.名前= "HTTP GET"  
  12. st.ReadyToTrip = func(counts gobreaker.Counts) bool {
  13. 失敗率:= float64(counts.TotalFailures) / float64(counts.Requests)
  14. 戻り値 counts.Requests >= 3 && failureRatio >= 0.6
  15. }
  16. cb = gobreaker.NewCircuitBreaker(st)
  17. }
  18. // CircuitBreakerhttp.Get をラップします。
  19. func Get(url string) ([]byte, error) {
  20. 本文、エラー:= cb。実行(func() (interface{}, error) {
  21. 応答、エラー:= http.Get(url)
  22. err != nil の場合 {
  23. nil、エラーを返す
  24. }
  25. 延期resp.Body.Close ()
  26. 本文、エラー:= ioutil.ReadAll(resp.Body)
  27. err != nil の場合 {
  28. nil、エラーを返す
  29. }
  30. 本体を返す、nil
  31. })
  32. err != nil の場合 {
  33. nil、エラーを返す
  34. }
  35. body.([]byte)、nilを返す
  36. }
  37. 関数main() {
  38. 本文、エラー:= Get( "http://www.google.com/robots.txt" )
  39. err != nil の場合 {
  40. ログ.致命的(エラー)
  41. }
  42. fmt.Println(文字列(本文))
  43. }

要約する

この記事では、クラウド ネイティブ システムの弾力性モデルについて説明します。弾力性モデルとは、事前設定された戦略を通じて障害に直接対処し、一時的に利用できない要求を補正し、障害の伝播を回避することです。これは、マイクロサービスの高可用性と弾力的なフォールト トレランスを実現するために非常に重要です。

<<:  Springboot2.x AOPはキャッシュロックと分散ロックを実装します

>>:  クラウドコンピューティングの運命: 世界が 1 台のコンピューターに統合され、サーバーレス運用がサポートされる

推薦する

企業が収益性の高いウェブサイトを構築するための4つの成功の秘訣

収益性の高いウェブサイトは、ウェブサイトのプロモーションから切り離すことはできません。中国のインター...

ホストレビューボーナス: フットボールベイビー

週末です、とても退屈です、この記事は数字を埋めるためのものです、ちなみに、特典をいくつかあげます、以...

ウェブサイトの評価期間中、SEOERは雲が晴れて月が出てくるまで待った。

多くのウェブマスターは、Baidu のテストに耐えられないため、ウェブサイト構築の初期段階で自動的に...

ウェブサイトが衰退の鎖から抜け出すために、ウェブサイトの基盤構築に努める(パート1)

インターネット技術の継続的な成長により、ウェブサイトの構築はコップ一杯の水を飲むのと同じくらい簡単に...

30日間でキーワードランキング1位を獲得した方法

私たち中小企業は、SEO を行う際に、特にウェブサイトを構築したばかりの最初の数か月間は非常に悩むこ...

dedipath: 月額 55 ドル、米国サーバー、E-2146G/32gDDR4/2T ハードドライブ/1Gbps 帯域幅 (トラフィック無制限)/5IP/20G 防御

dedipath は現在、米国ダラス データ センターの専用サーバー特別プロモーションを提供していま...

Quickpacket ラスベガス VPS シンプルレビュー (Xen 512 メモリ)

私は、Fiberhub ラスベガス データ センターで、XEN 仮想化に基づく QuickPacke...

Google検索ランキングのポイント

今日は、SEOにおけるGoogleランキングの重要なポイントについてお話ししましょう。ウェブサイトの...

簡単な分析: ソフト記事のプロモーションのチャネルは何ですか?

ソフトテキスト プロモーションのチャネルは何ですか? SEO 担当者にとって、優れたプロモーション ...

ウェブサイトの価値はユーザーによって決まるので、Baiduだけを見てはいけません

10月27日の夕方、公式サイトのロゴが多くの友人のウェブサイトに登場し、QQグループの全員が話題にし...

2019 年のエンタープライズ クラウドの主要トレンド

企業がコンピューティングとネットワーク アーキテクチャを近代化するにつれて、クラウド ネイティブ ア...

SEOフォーラムの現状分析からより有益なSEO情報を得る方法

SEO 実践者として、私と同じように貴重な SEO 情報を見つけるためにフォーラムに行くことを好む人...

効率的なウェブサイトランキングを作成するための5つの重要なポイントについて簡単に説明します。

ウェブサイトの最適化の過程では、同じ種類のウェブサイトでもランキングは必ず異なり、同じ最適化方法を使...

1+2のプロセスを理解すれば、Java仮想マシンを理解できる

[[322423]]面接中に JVM に関連する質問をされると、多くの面接者は機械的に暗記しており、...

ウェブマスターのSEO体験の共有

検索エンジンのアルゴリズムがますます洗練されるにつれて、ウェブサイトの品質に対する要求も高まっていま...