調べるきっかけ
飲み会で会社の若手がNetflixのHystrixってのがCircuit Breaker Patternで、要するにNetflixやべーです。って言ってたんだけど、正直何それ?状態だったのでどういうものなのかだけは押さえておこう的なアレです。
どういうものか?
Circuit Breakerは日本語にすると、そのまま「ブレーカー」ですね。乾燥機をつけたままエアコンを付けると落ちるヤツです。
通常、API呼び出しとかで呼び出し先に障害が発生して接続できない場合、タイムアウトまで待ってエラーを返すようになっているかと思います。
エラーになることがわかっているのに、リクエストするのはムダですし、相手側の負荷も高めてしまうので好ましくありません。
こういうところにブレーカーを入れておくと、しきい値を超えてリクエストが失敗したら、ブレーカーを落として、即エラーを返るようにしてあげるイメージです。
Webサービスで言うところのブレーカーは、障害の連鎖を食い止めるために入れるものかなぁと思います。
障害の連鎖
マイクロサービスとかだと、別のサービスのAPIを呼び出して、その中ではさらに別のサービスを呼び出してといったようになっているかと思います。
A -> B -> C
ここでCに障害が発生したとすると、Bはタイムアウトまでレスポンスを待ちます。Bはタイムアウトを待っているうちに、他からのリクエストが来て、そいつらもタイムアウトまでレスポンスを待つ、、、リソースを食いつぶして、Bも落ちる。Bが落ちると、次はAみたいな感じで障害の連鎖が起こることが懸念されます。
参考:マイクロサービスにおける障害と Failurewall
https://qiita.com/okumin/items/d7a108ea36f3ad2e3882
図が超絶わかりやすかったです
Circuit Breaker Pattern
マーチン・ファウラーが言ってるものらしく、XPとかリファクタリングとか2000年くらいにjavaやってた人は聞いたことのある名前なはずです。ちょっとテンション上がりました。
https://martinfowler.com/bliki/CircuitBreaker.html
短いし、Google翻訳にぶち込めばなんとなく意味わかります。
実装例みたいなコードやシーケンス図あるので理解しやすいと思います。
クライアントと呼び出し先のサービスの間に、ブレーカーを入れます。
ブレーカーが落ちる、ブレーカーを上げる、ここらへんを自動的に行われるようにするパターンですね。
たとえばこんな感じでしょうか
- 一定時間内にしきい値の回数以上失敗した場合、ブレーカーを落とす
- 最後の失敗から一定時間以上経過していたら、ブレーカーを戻す(再度落ちることもある)
まとめ
実装自体はまんま電気のブレーカーがイメージ通りでした。
リモートへのアクセスが失敗した場合に、うまいこと障害が連鎖しないための仕組み。
呼び出し先のサービスが止まったら、呼び出し元のサービスが継続できない所だとあまり意味がない気がします。それでも、NetflixのHystrix使えば監視・モニタリングなんかもできるようで、やばそうな雰囲気とか感じ取れるかも。
確かに、NetflixのHystrixってのがCircuit Breaker Patternで、要するにNetflixやべーです。