アーキテクチャパターン

サーキットブレーカー さーきっとぶれーかー

障害伝播防止マイクロサービスフォールトトレランスリトライタイムアウトレジリエンス
サーキットブレーカーについて教えて

簡単に言うとこんな感じ!

家のブレーカーと同じイメージだよ!障害が起きているサービスへの呼び出しを自動で「遮断」して、システム全体がダウンするのを防いでくれる仕組みなんだ。「壊れてるところには繋がない」ってことで、被害が広がらないようにしてくれるの!


サーキットブレーカーとは

サーキットブレーカー(Circuit Breaker)とは、マイクロサービスや分散システムにおいて、障害が発生しているサービスへの呼び出しを自動的に遮断し、障害の連鎖(カスケード障害)を防ぐためのアーキテクチャパターンです。名前の由来は、電気系統を過電流から守る「ブレーカー(遮断器)」そのものです。

マイクロサービスでは、複数のサービスが連携し合っています。あるサービスが遅くなったり落ちたりしたとき、そのサービスを呼び出し続けると、呼び出し元も応答待ちでリソースを消費し続けます。これが次々と波及してシステム全体が停止するのがカスケード障害です。サーキットブレーカーはこの伝播を「遮断」することで食い止めます。

2007年にMartin Fowlerがパターンとして整理し、その後NetflixがOSSライブラリ「Hystrix」で実装・公開したことで広く普及しました。現在ではクラウドネイティブ開発の必須パターンの一つとして認識されています。


3つの状態で動く仕組み

サーキットブレーカーは内部に3つの状態(ステート)を持ち、呼び出しの成功・失敗に応じて自動で状態遷移します。

状態意味動作
クローズ(Closed)正常。回路が繋がっている状態通常どおりリクエストを通す
オープン(Open)遮断。回路が切れている状態リクエストを即座に遮断しエラーを返す
ハーフオープン(Half-Open)様子見。少しだけ通してテストする状態試験的にリクエストを通し、成功すればClosed、失敗すればOpenに戻す
Closed (正常) Half-Open (様子見) 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)サービスごとにスレッドやリソースを分離障害の影響範囲を物理的に分ける補完的パターン
レジリエンスパターンの連携イメージ 呼び出し元 サーキット ブレーカー 呼び出し先 フォールバック ①リクエスト ②通過 or 遮断 遮断時は代替値を返す

主な実装ライブラリ

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 7231HTTPセマンティクス。503 Service Unavailableはオープン時の応答として使われる
RFC 7807Problem Details for HTTP APIs。エラーレスポンスの標準形式

関連用語