Hystrixが使用する隔壁パターンとは何ですか?


回答:


193

一般的な

一般に、隔壁パターンの目的は、システムの一部で障害を回避してシステム全体を停止させることです。この用語は、1つの船体の違反が船全体を氾濫させるのを避けるために、船が別々の水密区画に分割されている船から来ています。1つの隔壁のみを水浸しにします。

隔壁パターンの実装は、システムを保護する障害の種類に応じて、さまざまな形をとることができます。この回答では、Hystrixが処理する障害のタイプについてのみ説明します。

バルクヘッドのパターンは、Release It!マイケル・T・ナイガード

Hystrixが解決するもの

Hystrixのバルクヘッド実装は、コンポーネントへの同時呼び出しの数を制限します。このようにして、コンポーネントからの応答を待機しているリソース(通常はスレッド)の数が制限されます。

AB、およびCの 3つの異なるコンポーネントを使用するリクエストベースのマルチスレッドアプリケーション(たとえば、一般的なWebアプリケーション)があるとします。コンポーネントCへの要求がハングし始めると、最終的にはすべての要求処理スレッドがCからの応答を待機してハングします。これにより、アプリケーションは完全に応答しなくなります。Cへのリクエストの処理が遅い場合、負荷が十分に高いと同様の問題が発生します。

Hystrixの隔壁パターンの実装は、コンポーネントへの同時呼び出しの数を制限し、この場合、アプリケーションを節約します。30のリクエスト処理スレッドがあり、Cへの同時呼び出しは10に制限されていると仮定します。Cを呼び出すと、最大10個の要求処理スレッドがハングする可能性があり、他の20個のスレッドは要求を処理してコンポーネントAおよびBを使用できます。

Hystrixのアプローチ

Hystrix 'には、隔壁への2つの異なるアプローチ、スレッド分離とセマフォ分離があります。

スレッドの分離

標準的なアプローチは、コンポーネントCへのすべてのリクエストを、固定数のスレッドを持ち、リクエストキューがない(または小さい)個別のスレッドプールに渡すことです。

セマフォの分離

もう1つの方法は、Cへの要求の前に、すべての呼び出し元に許可(タイムアウトなし)を取得させることです。セマフォからパーミットを取得できない場合、Cの呼び出しはパススルーされません。

違い

スレッドプールアプローチの利点は、Cに渡される要求がタイムアウトになる可能性があることです。これは、セマフォを使用する場合は不可能です。


10
さらに、元のHystrix wikiには、両方のアプローチの詳細な説明があります:github.com/Netflix/Hystrix/wiki/How-it-Works
Dmitry

1
サーキットブレーカーとバルクヘッドの違いは何ですか?
voipp 2018年

4
@voippサーキットブレーカーはまったく異なります。それらは、サービスが異常な状態にあることを検出し、異常なサービスを呼び出さない「失敗高速」状態に呼び出し元を移動しますが、サービスが再び正常になるまで、代わりにエラーコードを返します。これにより、異常なサービスの過負荷を回避して回復できるようになり、呼び出し元の速度が低下しないため、連鎖的な障害が防止されます。
K Erlandsson

1

以下は、Netflix Hystrixから着想を得たResilience4jのバルクヘッドの実行時の説明の良い例です。

以下の設定例は、使用法をいくらか明確にするかもしれません。

構成例:同時に最大5つの同時呼び出しを許可します。インプロセス5の同時実行の1つが終了するまで、または最大2秒まで、他の呼び出しを待機し続けます。

システムが消費できる以上の負荷をシステムに負担させることはありません。着信負荷が消費よりも大きい場合は、適切な時間待機するか、タイムアウトして代替パスを探します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.