バルクヘッド ばるくへっど
簡単に言うとこんな感じ!
船の「隔壁(バルクヘッド)」のように、一部が浸水しても他の区画には広がらない設計のこと。サービスが一部壊れても全体が落ちないようにする仕組みだよ!
バルクヘッドとは
バルクヘッド(Bulkhead Pattern)とは、システムの構成要素を分離された「区画」に分割することで、一部の障害が全体に波及するのを防ぐ設計パターンです。名称は船舶の隔壁(バルクヘッド)に由来します。船では各区画が防水隔壁で仕切られているため、一区画が浸水しても他の区画は安全を保ちます。マイクロサービスや分散システムの耐障害性(Resilience)設計における重要なパターンのひとつです。
具体的には、スレッドプールの分離・コネクションプールの分離・仮想マシンやコンテナの分離などで実現します。たとえばある外部APIへの呼び出し専用のスレッドプールを設け、そのAPIが遅延しても他の処理に使うスレッドを使い果たさないようにします。
実装パターン
スレッドプール分離
| サービス | 割り当てスレッド |
|---|---|
| 決済API呼び出し | 最大20スレッド |
| 在庫API呼び出し | 最大10スレッド |
| メール送信 | 最大5スレッド |
決済APIが詰まって20スレッド全部ふさがっても、在庫APIのスレッドには影響しない。
セマフォ分離
スレッドを使わず、同時実行数の上限(セマフォ)を設ける方式。軽量だが、タイムアウト処理には不向きなケースもある。
コンテナ・プロセス分離
マイクロサービスごとに別コンテナ/プロセスに分けること自体がバルクヘッドです。一つのコンテナがCPUを食いつぶしても、Kubernetesのリソース制限(limits)で他コンテナへの影響を防ぎます。
歴史と背景
バルクヘッドパターンはMichael T. NygardがRelease It!(2007年)で広めたレジリエンス設計パターンの一つです。クラウドネイティブな分散システムでは、ネットワーク遅延・外部サービス障害が日常的に発生するため、Hystrix(Netflixが開発・OSS公開、現在は非推奨)やResilience4j(Java)、Polly(.NET)などのライブラリに実装されています。Kubernetesの普及とともに「コンテナ自体がバルクヘッド」という考え方がデファクトになっています。
サーキットブレーカーとの違い
関連用語
- ストラングラーフィグ — システム移行パターン
- マルチリージョンアーキテクチャ — リージョン単位のバルクヘッド
- セルベースアーキテクチャ — バルクヘッドをセルという単位に発展させたパターン