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

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

[[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 台のコンピューターに統合され、サーバーレス運用がサポートされる

推薦する

アップル:中国本土でのiCloudサービスは国内企業が運営

Appleによると、今年2月28日より、中国本土におけるiCloudサービスの運営が雲商貴州社に移管...

SEO 業界はいつまで存続するのでしょうか?

Ye Meng Chu Chen 氏の記事のタイトル「SEO 業界はいつまで存続するのか?」を見たら...

クラウドへの移行を成功させる方法

クラウド移行が適切に実施されると、速度、生産性、弾力性、スケーラビリティが向上します。しかし、適切に...

Baidu の大規模アップデート後にウェブサイトを最適化する方法

皆さんご存知の通り、Baiduはしばらく前に大きなアップデートを行い、多くのウェブサイトのキーワード...

クラウドコンピューティング支出の35%が無駄になっている理由

クラウド コンピューティングへの支出が急増している一方で、多くの組織はコスト管理、自動化、プロバイダ...

BeastNode - 7 ドル / 1g メモリ / 35g SSD / 2T トラフィック / シングルホップ / シカゴ / アムステルダム

BeastNode.com はカリフォルニアに登録された会社です。主に MINECRAFT ゲームに...

エッジコンピューティングはトラック輸送の未来か?

テクノロジーが進歩するにつれて、トラック輸送業界が業務を最適化する機会が増えます。連邦自動車運送安全...

Pacificrack: 米国向けに最適化された VPS、75% オフ、最低 $8/年 (¥50/年)、無料スナップショット付き

Pacificrack は一昨日 80% 割引をリリースしましたが、提供された構成は 2 つだけでし...

fdcservers-$0.99/Xen/128MB RAM/2か月間無料

fdcservers.net のクリスマス プロモーションが早くも始まりました。最初の 1 か月分を...

Baidu ウェイトとは何ですか?

Baidu ウェイトは、ウェブサイトのキーワードランキングに基づいて公開され、ウェブサイトにトラフィ...

Linode VPS レビュー/新しい SSD ディスク/E5-2680V2

一昨日、Linodeはアップグレードが完了したと発表しました。今回はハードウェアが大きく変わりました...

どのようなユーザーエクスペリエンスが検索エンジンのニーズを満たすのでしょうか? (二)

前回の記事では、ユーザーエクスペリエンスに従わないウェブサイトは必然的に淘汰されるということを中心に...

エンタープライズ イノベーションのために生まれた VMware が 2B 業界に新たなビジネス モデルを創出

[51CTO.com からのオリジナル記事] 現在、企業の IT 支出が中国全体の経済変革を推進して...