【ばるくへっどぱたーん】
バルクヘッドパターン とは?
💡 船の「隔壁」のように障害を区画内に封じ込める
📌 このページのポイント
- コンポーネントごとにリソースプール(スレッド、接続数など)を分離して運用する
- 1つのサービスが障害を起こしても、他のサービスのリソースを食い潰さない
- サーキットブレーカーやタイムアウトパターンと組み合わせて使うことが多い
- マイクロサービスアーキテクチャでの耐障害性設計の基本パターンの一つ
バルクヘッドパターンって、なんだか船の話みたいだね?
まさに船が由来だよ!大型船は内部が隔壁で区切られていて、1箇所に穴が空いても他の区画には水が入らない仕組みになっているんだ。この考え方をシステム設計に応用したのがバルクヘッドパターンだよ
システムだとどういうことなの?
たとえばWebアプリで「決済サービス」と「検索サービス」が同じスレッドプールを共有していたとするよ。決済サービスが遅延してスレッドを全部使い切ると、検索サービスまで止まっちゃうよね。バルクヘッドで分離すれば、決済が遅くても検索は動き続けるんだ
具体的にどうやって分離するの?
サーキットブレーカーとの違いは何なの?
サーキットブレーカーは「障害を検知して通信を遮断する」仕組みで、バルクヘッドは「そもそもリソースを分離しておく」仕組みだよ。両方組み合わせると最強で、バルクヘッドで影響範囲を限定し、サーキットブレーカーで障害を素早く遮断するんだ
クラウドだと簡単にできるの?
コンテナオーケストレーションやサービスメッシュを使えば比較的楽にできるよ。Istioのようなサービスメッシュなら、サービスごとのコネクション数制限をYAMLで設定するだけでバルクヘッドが実現できるんだ
まとめ:ざっくりこれだけ覚えればOK!
「バルクヘッドパターン」って出てきたら「障害を区画内に閉じ込めて全体への波及を防ぐ設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Bulkhead Pattern」 = 隔壁パターン
💬 船の隔壁(Bulkhead)は、浸水しても他の区画に水が入らないよう船体を仕切る壁のこと。その発想をソフトウェアに応用したよ