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

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

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

推薦する

Baiduのホームページ上の「優良サイト」からユーザーエクスペリエンスを分析

Baidu は最近大きなアップデートがなく、いくつかのローカルなマイナーアップデートがあるだけです。...

ウェブサイト構築に適した大容量ハードディスク搭載のおすすめVPS

海外には大容量ハードディスク搭載のVPSがたくさんあります。大容量ハードディスク搭載の通常のVPSと...

エッジ コンピューティングとは何ですか? また、高等教育でどのように活用できますか?

今後 18 か月以内にエッジ コンピューティング ソリューションを導入し、モノのインターネット (I...

SEOプロジェクトマネージャーに必要な知識とスキル

優秀な SEO プロジェクト マネージャーまたは SEO スーパーバイザーは、ほとんどの組織で最も見...

長所と短所を比較検討した後でのみ、他人のブランドワードを傍受することで何かを得ることができる。

SEO をしばらくやっている人なら、トラフィックを傍受する方法を知っていると思います。これをやったこ...

対外貿易マーケティング

インターネット産業の出現と発展から現在に至るまで、インターネットの世界は次々と伝説を生み出してきまし...

モバイルクライアントの売上を増やす10の方法: 携帯電話からユーザーを引き付ける

多くの企業は、ウェブサイトのトラフィックを増やし、顧客に自社製品についてより詳しく知ってもらうために...

検索エンジンアルゴリズムの4つの主要要素の分析

検索エンジンのアルゴリズムは機密事項であり、日々調整されていると言われていますが、詳細は誰も知りませ...

Linkerd でトラフィック分割を実装する

Linkerd では、カナリア リリースはトラフィック分割を通じて管理されます。これは、動的に構成可...

100tb: 5 つの大型コンピュータ ルーム、専用サーバーの 10% 割引、月間 100T のトラフィック

UK2グループのサーバーブランドである100tbは、サーバーを10%割引する「秋のディスカウントデー...

INIZ - 年間 14 ドル / メモリ 256 MB / ハードディスク 20 GB / トラフィック 500 GB / ニューヨーク / ロサンゼルス

INIZは中国人を嫌っています。私は1年以上アカウントを持っていましたが、結局削除されました。でも、...

半年以上Web業界に携わってきて、色々な思いが溢れています!

昨年ウェブサイトを立ち上げてから半年が経ちました。現在、両方のウェブサイトが安定して稼働しています。...

Oracle Autonomous Databaseがスーパーパワーを提供

オラクルの会長兼 CTO であるラリー・エリソンは本日基調講演を行い、Oracle Autonomo...

三友クラウド:高速VPS、最低40元、オプションのデータセンター - 米国CN2\日本CN2\香港CMI

2009年に設立され、主に海外のクラウドホスティング事業に注力しています。VPSは、日本CN2(東京...