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

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

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

推薦する

化粧品 B2C ウェブサイトの SEO に関する私の意見 - 社内バージョン

2013 年 2 月 19 日に Baidu の「青大根アルゴリズム」が正式にリリースされて以来、中...

百度がランキングを付けずにウェブサイトを復元するという憶測

6月から、百度は大規模な低品質サイトの取り締まりを開始しました。ウェブマスターのウェブサイトがどれだ...

301 リダイレクトを使用して 404 ページを独自の外部リンクに転送することの危険性について簡単に説明します。

今日、A5で「301を使用して404エラーを外部リンクに変える方法に関する記事」という記事を見ました...

SEO トラフィックに影響を与える 3 つの要素: インクルージョン + ランキング + クリックスルー率

以前、Xiwei Qiangwei 氏が紹介した記事「検索トラフィックこそが王様、トラフィックこそが...

3D ポイントクラウド認識は安全ですか?ミシガン大学は、深刻な歪みに対処するためにデータセットの堅牢な分析を提案している

3D ポイント クラウドは、3D 認識技術で広く使用されています。自動運転や医療画像処理など、一部の...

SEOにおけるセカンダリサイトとコラムサイトのメリットとデメリットをご存知ですか?

みなさん、こんにちは。皆さんと私の経験を共有してから長い時間が経ちました。最近、私は内部ウェブサイト...

クラウドネイティブデータベース成熟モデルの分析

現在、多くの企業が Kubernetes と関連テクノロジーを使用してワークロードをクラウドに移行し...

JVMメモリを監視しないキャリアは不完全です

[[393678]]この記事はWeChatの公開アカウント「New Vision of Progra...

コンセプトから実装の成功まで、テクノロジーの専門家がクラウドインフラストラクチャの最先端のテクノロジーを共有します

[51CTO.com からのオリジナル記事] クラウドコンピューティングの 3 大サービスモデルのひ...

A5 フォーラム署名の消失について、ウェブマスターはどう考えていますか?

4月25日、百度のウェブマスターLeeが外部リンクの不正行為を判定する方法を発表した後、ウェブマスタ...

百度、湖北成利の公式販売サイトを更新し権限を縮小

今朝、私に悪いことが起こりました。私が担当していた湖北成利公式サイトの販売サイトがランキング0位にな...

DigitalOcean VPS 知っておくべき「秘密」

デジタルオーシャンから低価格で高性能な VPS を購入したい場合、まず知っておくべきことは、デジタル...

ウェブサイトのランキングに影響を与える6つの主な要因

最近、Baiduは大きなアップデートを行っておらず、ウェブマスターは非常に落ち着いていますが、多くの...

ultravps.eu - 新しい QN ロサンゼルス / KVM / 512m メモリ / 1.68 ユーロ / 15g ハード ディスク / 500g トラフィック

実は、ultravps.eu は Hostcat に何度も登場しています。ドイツの老舗ホスティング会...