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