【ばるくへっどぱたーん】

バルクヘッドパターン とは?

💡 船の「隔壁」のように障害を区画内に封じ込める
📌 このページのポイント
バルクヘッドパターン:障害を区画内に封じ込める ✗ 共有リソース 決済 検索 通知 共有スレッドプール(10本) 決済が遅延 → 全スレッド占有 → 検索・通知も 全停止!💥 ◎ バルクヘッド 決済 3本 障害 💥 ここだけ 検索 4本 正常 ✅ 通知 3本 正常 ✅ 🚢 船の隔壁と同じ発想 1区画が浸水しても、隔壁が他の区画への水の侵入を防ぐ サーキットブレーカーと組み合わせるとさらに効果的
バルクヘッドパターンのイメージ
ひよこ ひよこ

バルクヘッドパターンって、なんだか船の話みたいだね?

ペンギン先生 ペンギン先生

まさに船が由来だよ!大型船は内部が隔壁で区切られていて、1箇所に穴が空いても他の区画には水が入らない仕組みになっているんだ。この考え方をシステム設計に応用したのがバルクヘッドパターンだよ

ひよこ ひよこ

システムだとどういうことなの?

ペンギン先生 ペンギン先生

たとえばWebアプリで「決済サービス」と「検索サービス」が同じスレッドプールを共有していたとするよ。決済サービスが遅延してスレッドを全部使い切ると、検索サービスまで止まっちゃうよね。バルクヘッドで分離すれば、決済が遅くても検索は動き続けるんだ

ひよこ ひよこ

具体的にどうやって分離するの?

ペンギン先生 ペンギン先生

いくつか方法があるよ。スレッドプールを分ける、コネクションプールを分ける、コンテナプロセスを分ける、マイクロサービスとして独立させるなど。粒度はコストとリスクのバランスで決めるんだ

ひよこ ひよこ

サーキットブレーカーとの違いは何なの?

ペンギン先生 ペンギン先生

サーキットブレーカーは「障害を検知して通信を遮断する」仕組みで、バルクヘッドは「そもそもリソースを分離しておく」仕組みだよ。両方組み合わせると最強で、バルクヘッドで影響範囲を限定し、サーキットブレーカーで障害を素早く遮断するんだ

ひよこ ひよこ

クラウドだと簡単にできるの?

ペンギン先生 ペンギン先生

コンテナオーケストレーションサービスメッシュを使えば比較的楽にできるよ。Istioのようなサービスメッシュなら、サービスごとのコネクション数制限をYAMLで設定するだけでバルクヘッドが実現できるんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「バルクヘッドパターン」って出てきたら「障害を区画内に閉じ込めて全体への波及を防ぐ設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Bulkhead Pattern」 = 隔壁パターン
💬 船の隔壁(Bulkhead)は、浸水しても他の区画に水が入らないよう船体を仕切る壁のこと。その発想をソフトウェアに応用したよ
← 用語集にもどる