FIG-016

サーキットブレーカー — 落ちた相手と共倒れしない

分散システム 2026.06.12 公開 読了 約11分

家のブレーカーは、電気が流れすぎると自分から回路を切って、家が火事になるのを防ぎます。分散システムのサーキットブレーカーも同じ発想です。呼び出した先のサービスが落ちているとき、無駄な呼び出しを自分から遮断して、障害が連鎖して全体に広がるのを防ぎます。

肝は3つの状態を行き来する「状態マシン」であること。下の図1で、相手サービスをわざと故障させたり復旧させたりしながら、ブレーカーがClosed → Open → Half-Open とどう切り替わるかを動かしてみてください。

CLOSED
正常 — そのまま通す
OPEN
遮断 — 即座に失敗を返す
HALF-OPEN
お試し — 1回だけ通す
相手サービスの状態:
連続失敗: 0 / 3
CALL LOG — 呼び出しの結果
「サービスを呼び出す」を押してみてください。
いまブレーカーは CLOSED(正常)。呼び出しはそのまま相手サービスに届きます。
図1 — 連続失敗で遮断し、時間を置いて1回だけ様子を見る

3つの状態が、それぞれの役を演じる

CLOSED(閉=通電)は平常運転。呼び出しはそのまま相手に届きます。ただしブレーカーは裏で失敗の回数を数えていて、連続失敗が一定回数(図1では3回)に達すると、OPENに切り替わります

OPEN(開=遮断)になると、もう相手を呼びに行きません。呼び出した瞬間に即座に失敗を返す(フェイルファスト)のがポイントです。どうせ落ちている相手を毎回タイムアウトまで待つのは、時間の無駄なうえ、待たされたスレッドが詰まって自分まで巻き添えで倒れるからです。これがブレーカーで防ぎたい「障害の連鎖(カスケード障害)」です。

そして一定時間が経つとHALF-OPEN(半開=お試し)へ。ここで1回だけ本物の呼び出しを通してみます。成功すれば「もう直ったな」とCLOSEDに戻り、失敗すれば「まだダメか」とOPENに逆戻りしてもう一度待ちます。全開で再開せず1回だけ様子を見るのは、復旧しかけの相手にいきなり全リクエストを浴びせて、再び潰さないための慎重さです。

用語ミニ辞書
フェイルファスト
ダメだと分かっている呼び出しを、待たずに即座に失敗させること。OPEN状態の振る舞い。
カスケード障害
1つのサービスの不調が、それを待つ別サービスへ次々と連鎖し、全体が倒れること。
HALF-OPEN
復旧したか確かめるため、限られた数の呼び出しだけ通してみる試験状態。

まとめ

サーキットブレーカーは「落ちている相手を呼び続けて共倒れになる」のを防ぐ安全装置です。CLOSEDで数え、OPENで遮断し、HALF-OPENで様子を見る — この3状態の往復だけ覚えておけば十分。マイクロサービスのように「サービスが別のサービスを呼ぶ」構成では、相手はいつか必ず落ちる前提で、この遮断器を挟んでおくのが定石です。