サーキットブレーカーパターン
失敗しているサービスへの呼び出しを一時的に停止します。
「サーキットブレーカーパターン」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
再試行では解決できない問題
依存先が本当に停止している場合、すべてのリクエストを再試行すると負荷が積み重なり、自分のアプリの処理も遅くなります。サーキットブレーカーパターンは継続的な障害を検出し、しばらくの間、障害が発生しているサービスへの呼び出しを停止します。
電子回路からの着想
電気回路を保護するために作動するブレーカーと同じように、このパターンは障害が多発すると「トリップして開いた」状態になり、その後、依存先が復旧したかどうかを自動的に確認します。
3 つの状態
サーキットブレーカーには 3 つの状態があります。Closed(クローズド)は呼び出しが通常どおり通過する状態、Open(オープン)は呼び出しが直ちにブロックされる状態、Half-Open(ハーフオープン)は復旧を試行呼び出しで確認する状態です。
Closed 状態
Closed状態では、リクエストが通過し、Polly が失敗率を追跡します。サンプリング期間内に失敗がしきい値を超えると、ブレーカーは Open 状態に移行します。
Open 状態
Open状態では、Polly がショートサーキットし、依存先を呼び出すことなくBrokenCircuitExceptionを直ちにスローします。これにより依存先が復旧するための余地を作り、呼び出し元には早く失敗を返します。
try
{
await pipeline.ExecuteAsync(token => CallServiceAsync(token));
}
catch (BrokenCircuitException)
{
// circuit is open, fail fast
}Half-Open 状態
遮断期間が経過すると、ブレーカーはHalf-Open状態に移行し、試行リクエストを 1 つ許可します。成功すると回路を閉じ、失敗すると次の遮断期間に向けて再び開きます。
ブレーカーの設定
Polly v8 ではCircuitBreakerStrategyOptionsを使用します。主な設定は、FailureRatio(例:0.5 = 50%)、MinimumThroughput、SamplingDuration、BreakDurationです。
using Polly.CircuitBreaker;
var pipeline = new ResiliencePipelineBuilder()
.AddCircuitBreaker(new CircuitBreakerStrategyOptions
{
FailureRatio = 0.5,
MinimumThroughput = 10,
SamplingDuration = TimeSpan.FromSeconds(30),
BreakDuration = TimeSpan.FromSeconds(15)
})
.Build();FailureRatio と MinimumThroughput
FailureRatioはブレーカーを作動させる失敗の割合です。MinimumThroughputを設定すると、十分な回数の呼び出しが行われた後にだけブレーカーが作動するため、初期の 1 回の失敗で早まって開くことがありません。
状態変化への対応
OnOpened、OnClosed、OnHalfOpenedのコールバックを使うと、依存先の状態が悪化した際に状態の遷移をログに記録したり、アラートを発生させたりできます。
new CircuitBreakerStrategyOptions
{
FailureRatio = 0.5,
OnOpened = args =>
{
Console.WriteLine($"Circuit opened for {args.BreakDuration}");
return default;
}
};再試行との組み合わせ
再試行とサーキットブレーカーは互いに補完し合います。再試行は短時間の障害に対処し、障害が継続するとブレーカーが再試行を停止します。順序が重要になるため、パイプラインのレッスンで改めて説明します。
手動制御
CircuitBreakerManualControlを保持すると、ブレーカーを手動で隔離(強制的に開く)または閉じることができます。メンテナンス期間に便利です。
var manualControl = new CircuitBreakerManualControl();
await manualControl.IsolateAsync(); // force open
await manualControl.CloseAsync(); // force closed確認テスト
サーキットブレーカーパターンをテストします。
まとめ
サーキットブレーカーは、Closed、Open、Half-Openの状態を切り替えることで、障害が発生している依存先を保護します。Polly v8 では、FailureRatio、MinimumThroughput、SamplingDuration、BreakDurationを指定したAddCircuitBreakerで作動条件を制御します。Open 状態ではBrokenCircuitExceptionをスローして早く失敗させることができ、コールバックと手動制御によって状態の監視や上書きも行えます。
よくある質問
「サーキットブレーカーパターン」レッスンは無料ですか?
はい。「サーキットブレーカーパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「サーキットブレーカーパターン」で何を学びますか?
失敗しているサービスへの呼び出しを一時的に停止します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「サーキットブレーカーパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 再試行ポリシー
- サーキットブレーカーパターン
- タイムアウトとフォールバックのポリシー
- レジリエンスパイプライン