【さーきっとぶれーかー】

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

最終更新:
💡 障害の連鎖を防ぐ「電気ブレーカーのような安全装置」

呼び出し先の失敗が続いたときに、しばらくその呼び出しを止めてすぐエラーを返す設計パターン。障害中のサービスを待ち続けて、呼び出し元まで詰まる連鎖障害を防ぐ。

📌 このページのポイント
Closed 正常(通過) 失敗が多い Open 遮断(拒否) タイマー満了 Half-Open テスト(試行) 成功 失敗 失敗が続く相手への呼び出しを一時的に止め、連鎖障害を防ぐ
サーキットブレーカーパターン
ひよこ ひよこ
サーキットブレーカーって何のためにあるの?
ペンギン先生 ペンギン先生
マイクロサービスでは「Aが遅いBを呼び続けて→Aも詰まって→Aを呼んでいるCも詰まって」という連鎖障害が起きることがあるんだ。サーキットブレーカーは失敗が続くBへの呼び出しを一時的に止めるから、Aが巻き込まれにくくなるんだよ。
ひよこ ひよこ
止めるって、エラーを返すってこと?
ペンギン先生 ペンギン先生
そう。ブレーカーが開いている間は、Bに送ってタイムアウトを待つ代わりに、すぐ「利用できません」とエラーを返す。待ち時間がほとんどなくなるから、Aの処理が詰まりにくいんだ。代わりにキャッシュした値や簡易的な応答を返す「フォールバック」と組み合わせることも多いよ。
ひよこ ひよこ
ずっと止めたままだと、復旧したBにアクセスできないよね?
ペンギン先生 ペンギン先生
そこがよくできていて、Closed(通常)→Open(遮断)→Half-Open(試験)という3つの状態を持つんだ。遮断してから一定時間たつと、Half-Openで少しだけ呼び出しを通してみて、成功したらClosedに戻す。失敗したらまたOpenに戻るよ。
ひよこ ひよこ
「失敗が多い」ってどうやって決めるの?低すぎると正常なエラーで遮断されそうだし、高すぎると気づくのが遅れそう。
ペンギン先生 ペンギン先生
そこは本当に悩ましくて、どのサービスにも合う数字はないんだ。参考になるのはライブラリの既定値で、Hystrixは「直近10秒で20件以上の呼び出しがあり、エラー率50%以上」で遮断する設定だった。Resilience4jは「直近100回の呼び出しで失敗率50%以上」が既定で、遅い呼び出しの割合も条件にできるよ。
ひよこ ひよこ
じゃあ、既定値のまま使えばいいの?
ペンギン先生 ペンギン先生
既定値は出発点だね。呼び出しの量が少ないサービスで「直近100回」を待つと、判定までに時間がかかりすぎることもある。ふだんのエラー率や応答時間、タイムアウトの設定を観測して、障害試験で思ったとおりに開くか確かめながら調整するのが大事だよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「サーキットブレーカー」って出てきたら「失敗が続く相手への呼び出しを一時的に止めて、連鎖障害を防ぐ仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Circuit Breaker」 = 電気回路の「遮断器(ブレーカー)」
💬 家の電気ブレーカーと同じ発想だよ。過電流が流れたら回路を切って事故を防ぐように、失敗が続く呼び出しを切り離すんだ

参考資料

← 用語集にもどる