- 03/19/2020
- 4分で読める
-
- d
- D
- で読めるようになる。 a
- v
- d
-
+6
- サービス障害が発生した場合に、一部の機能を維持できるようにします。 アプリケーションの他のサービスおよび機能は動作し続けます。
- 消費するアプリケーションに対して異なるサービス品質を提供するサービスを展開できます。 高優先度コンシューマー プールは、高優先度サービスを使用するように構成できます。
Bulkheadパターンは障害に強いアプリケーションデザインのタイプである。 バルクヘッド アーキテクチャでは、アプリケーションの要素はプールに分離され、1 つが故障しても、他の要素は機能し続けます。 バルクヘッドという名前は、船体の隔壁(バルクヘッド)にちなんで付けられた。
Context and problem
クラウドベースのアプリケーションには複数のサービスが含まれ、各サービスには 1 つまたは複数のコンシューマーが存在します。 サービスにおける過度の負荷または障害は、そのサービスのすべての消費者に影響を与える。
さらに、消費者は複数のサービスに同時にリクエストを送信し、各リクエストにリソースを使用することがある。 コンシューマが設定ミスや応答しないサービスにリクエストを送信すると、クライアントのリクエストで使用されたリソースが適時に解放されないことがあります。 サービスに対するリクエストが続くと、それらのリソースが枯渇する可能性があります。 たとえば、クライアントのコネクションプールが枯渇する可能性があります。 その時点で、コンシューマーによる他のサービスへのリクエストに影響が出ます。 最終的に、コンシューマは、元の無応答のサービスだけでなく、他のサービスにもリクエストを送信できなくなります。
リソース枯渇の同じ問題は、複数のコンシューマを持つサービスにも影響します。 1 つのクライアントから発信される多数のリクエストは、サービス内の利用可能なリソースを使い果たす可能性があります。
Solution
Consumer load and availability requirements に基づいて、サービス インスタンスを異なるグループに分割します。 この設計は、障害を分離するのに役立ち、障害時であっても一部のコンシューマのサービス機能を維持できます。
コンシューマは、あるサービスを呼び出すために使用するリソースが、別のサービスを呼び出すために使用するリソースに影響しないように、リソースをパーティショニングすることも可能です。 たとえば、複数のサービスを呼び出すコンシューマには、サービスごとに接続プールを割り当てることができます。
このパターンの利点は次のとおりです。
次の図は、個々のサービスを呼び出す接続プールを中心に構成されたバルクヘッドを表しています。 サービス A に障害が発生するか、その他の問題が発生すると、接続プールは分離されるため、サービス A に割り当てられたスレッド プールを使用するワークロードのみが影響を受けます。 サービス B および C を使用するワークロードは影響を受けず、中断せずに作業を継続できます。
次の図は、複数のクライアントが 1 つのサービスを呼び出している様子を示しています。 各クライアントには個別のサービスインスタンスが割り当てられています。 クライアント 1 は要求が多すぎて、そのインスタンスをオーバーロードしています。 各サービス インスタンスは他から分離されているため、他のクライアントは呼び出しを続けることができます。
問題と考察
- アプリケーションのビジネス要件および技術要件を中心にパーティションを定義する。
- サービスまたはコンシューマをバルクヘッドにパーティショニングする場合、コスト、パフォーマンス、および管理性の面でオーバーヘッドと同様に、テクノロジが提供する分離レベルを考慮します。
- バルクヘッドを再試行、回路ブレーカー、およびスロットリング パターンと組み合わせて、より高度な障害処理を行うことを検討します。 resilience4j や Polly などのプロジェクトは、コンシューマ・バルクヘッドを作成するためのフレームワークを提供しています。
- サービスをバルクヘッドにパーティショニングする場合、それらを個別の仮想マシン、コンテナー、またはプロセスに展開することを検討してください。
- 非同期メッセージを使用して通信するサービスは、キューの異なるセットを通して分離することができます。 各キューは、キュー上のメッセージを処理するインスタンスの専用セット、または処理をデキューおよびディスパッチするアルゴリズムを使用するインスタンスの単一グループを持つことができます。
- バルクヘッドの粒度のレベルを決定します。 たとえば、テナントをパーティションに分散させたい場合、各テナントを個別のパーティションに配置したり、複数のテナントを1つのパーティションに配置したりできます。
- 各パーティションのパフォーマンスとSLAを監視することができます。
When to use this pattern
Use this pattern to:
- Isolate resources used to consume a set of backend services, especially if the application can provide some level of functionality even when one of the services are not responding.これは、一連のバックエンド サービスを消費するために使用するリソースを分離することです。
- 標準的な消費者から重要な消費者を分離する。
- カスケード障害からアプリケーションを保護する。
このパターンは、次の場合には適さないかもしれません:
- プロジェクトでは、リソースのあまり効率的ではない使用は受け入れられないかもしれません。
- 追加された複雑さは必要ない
例
次の Kubernetes 構成ファイルは、単一のサービスを実行するために、独自の CPU およびメモリのリソースと制限を持つ孤立したコンテナを作成します。