サーキットブレーカー さーきっとぶれーかー
簡単に言うとこんな感じ!
家のブレーカーと同じイメージだよ!障害が起きているサービスへの呼び出しを自動で「遮断」して、システム全体がダウンするのを防いでくれる仕組みなんだ。「壊れてるところには繋がない」ってことで、被害が広がらないようにしてくれるの!
サーキットブレーカーとは
サーキットブレーカー(Circuit Breaker)とは、マイクロサービスや分散システムにおいて、障害が発生しているサービスへの呼び出しを自動的に遮断し、障害の連鎖(カスケード障害)を防ぐためのアーキテクチャパターンです。名前の由来は、電気系統を過電流から守る「ブレーカー(遮断器)」そのものです。
マイクロサービスでは、複数のサービスが連携し合っています。あるサービスが遅くなったり落ちたりしたとき、そのサービスを呼び出し続けると、呼び出し元も応答待ちでリソースを消費し続けます。これが次々と波及してシステム全体が停止するのがカスケード障害です。サーキットブレーカーはこの伝播を「遮断」することで食い止めます。
2007年にMartin Fowlerがパターンとして整理し、その後NetflixがOSSライブラリ「Hystrix」で実装・公開したことで広く普及しました。現在ではクラウドネイティブ開発の必須パターンの一つとして認識されています。
3つの状態で動く仕組み
サーキットブレーカーは内部に3つの状態(ステート)を持ち、呼び出しの成功・失敗に応じて自動で状態遷移します。
| 状態 | 意味 | 動作 |
|---|---|---|
| クローズ(Closed) | 正常。回路が繋がっている状態 | 通常どおりリクエストを通す |
| オープン(Open) | 遮断。回路が切れている状態 | リクエストを即座に遮断しエラーを返す |
| ハーフオープン(Half-Open) | 様子見。少しだけ通してテストする状態 | 試験的にリクエストを通し、成功すればClosed、失敗すればOpenに戻す |
覚え方:「ブレーカーは3ポジション」
電気工事士の資格でも出てくる「ブレーカーのON/OFF/テスト」と同じ3状態だと覚えよう!Closed=ON(通電中)、Open=OFF(遮断)、Half-Open=テスト中。
主な設定パラメーター
| パラメーター | 意味 | 典型値例 |
|---|---|---|
| 失敗率閾値 | 何%失敗したらOpenにするか | 50% |
| 最小リクエスト数 | 判定に使う最低件数 | 10件 |
| Openの継続時間 | 何秒後にHalf-Openに移行するか | 30秒 |
| Half-OpenのテストURL数 | 様子見で通すリクエスト数 | 3件 |
歴史と背景
- 2007年 — Martin Fowlerが著書・ブログでCircuit Breakerパターンを体系化
- 2011年 — NetflixがHystrixをOSSとして公開。大規模マイクロサービスでの実績が注目される
- 2015年頃 — マイクロサービスアーキテクチャの普及とともに必須パターンとして認知が広がる
- 2018年 — NetflixがHystrixのアクティブ開発終了を表明。後継としてResilience4jが主流に
- 2018年〜 — Istioなどのサービスメッシュがサーキットブレーカーをインフラ層で提供するようになる
- 現在 — KubernetesのService Meshやクラウドマネージドサービス(AWS App Mesh、Azure API Managementなど)に標準機能として組み込まれている
関連パターンとの比較
サーキットブレーカーは単独で使われることは少なく、いくつかのレジリエンスパターンと組み合わせて使われます。
| パターン | 目的 | サーキットブレーカーとの関係 |
|---|---|---|
| リトライ(Retry) | 一時的な失敗を自動で再試行する | Openのときはリトライせずすぐ諦めるよう連携させる |
| タイムアウト(Timeout) | 応答待ちの上限時間を設ける | タイムアウトを失敗カウントとして扱う |
| フォールバック(Fallback) | 失敗時に代替の処理を返す | Openのときにキャッシュや固定値を返す処理と組み合わせる |
| バルクヘッド(Bulkhead) | サービスごとにスレッドやリソースを分離 | 障害の影響範囲を物理的に分ける補完的パターン |
主な実装ライブラリ
Java / Kotlin : Resilience4j, Spring Cloud CircuitBreaker
Go : go-resilience, Sony/gobreaker
Python : pybreaker
.NET : Polly
Node.js : opossum
インフラ層 : Istio, AWS App Mesh, Envoy Proxy
関連する規格・RFC
※ サーキットブレーカーパターン自体に対応するRFC・ISO規格はありませんが、関連するHTTPステータスや健全性確認の慣習として参照されるものを記載します。
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 7231 | HTTPセマンティクス。503 Service Unavailableはオープン時の応答として使われる |
| RFC 7807 | Problem Details for HTTP APIs。エラーレスポンスの標準形式 |
関連用語
- マイクロサービス — アプリを小さなサービス群に分割するアーキテクチャスタイル
- カスケード障害 — ある障害が連鎖して全体に波及する現象
- リトライパターン — 一時的な失敗を自動で再試行するレジリエンスパターン
- フォールバック — 処理失敗時に代替の応答や処理を返す仕組み
- バルクヘッドパターン — リソースを分離して障害の影響範囲を限定するパターン
- サービスメッシュ — マイクロサービス間の通信をインフラ層で管理する仕組み
- Kubernetes — コンテナのデプロイ・管理を自動化するプラットフォーム
- レジリエンス — システムが障害に対して回復・耐性を持つ能力