サーキットブレーカーライブラリ

外部サービスの障害を検知し、自動的にリクエストを遮断して障害の連鎖を防ぐライブラリ

設計パターン耐障害性

サーキットブレーカーライブラリとは

サーキットブレーカーは、外部サービスの障害を検知し、一定回数の失敗後にリクエストを自動的に遮断するパターンである。電気のブレーカーと同じ原理で、障害の連鎖 (カスケード障害) を防ぐ。

3 つの状態

3 つの状態を図で示す。

Closed (正常) → 失敗が閾値を超える → Open (遮断)
                                        ↓ タイムアウト後
                                    Half-Open (試行)
                                        ↓ 成功 → Closed
                                        ↓ 失敗 → Open
状態動作
Closedリクエストを通す、失敗をカウント
Openリクエストを即座に拒否 (外部サービスに送らない)
Half-Open少数のリクエストを試行し、回復を確認

TypeScript での実装

TypeScript での実装のコード例を示す。

class CircuitBreaker {
  private failures = 0;
  private state: 'closed' | 'open' | 'half-open' = 'closed';
  private nextRetry = 0;

  constructor(private threshold = 5, private timeout = 30000) {}

  async call<T>(fn: () => Promise<T>): Promise<T> {
    if (this.state === 'open') {
      if (Date.now() < this.nextRetry) throw new Error('Circuit is open');
      this.state = 'half-open';
    }
    try {
      const result = await fn();
      this.reset();
      return result;
    } catch (error) {
      this.failures++;
      if (this.failures >= this.threshold) {
        this.state = 'open';
        this.nextRetry = Date.now() + this.timeout;
      }
      throw error;
    }
  }

  private reset() { this.failures = 0; this.state = 'closed'; }
}

上のコードは最小構成で、Half-Open に入ったあとに試行数を絞る仕組みは入っていない。そのままだと待たされていたリクエストが一斉に流れ込み、復旧しかけの相手をもう一度倒しかねないので、Half-Open 中は 1 件だけ通して結果を見る、といった制限を足しておきたい。

Lambda は実行環境が再利用されるため、同一インスタンス内ではサーキットブレーカーの状態が保持される。ただし状態はその実行環境の中だけのもので、同時実行で別のインスタンスが立てば失敗カウントは共有されない。同時実行数が多いほど遮断が効き始めるまでに外部サービスへ流れる失敗リクエストの総数は増えるため、厳密に絞りたい場合は DynamoDBElastiCache など外部ストアに状態を置く。

リトライとの組み合わせ

リトライとの組み合わせを図で示す。

リクエスト → リトライ (3 回) → 全て失敗 → サーキットブレーカーが Open
  → 以降のリクエストは即座に 503 を返す (外部サービスに負荷をかけない)
  → 30 秒後に Half-Open → 1 件試行 → 成功 → Closed

AWS での代替手段

AWS ではサーキットブレーカーライブラリの代わりに、Step Functions のリトライ + Catch でエラーハンドリングを行ったり、API Gateway のタイムアウト設定を活用したりできる。App Mesh の Envoy プロキシでも同じことができたが、App Mesh は 2024 年 9 月 24 日に新規顧客の受付を終了しており、2026 年 9 月 30 日にサポート終了が予定されているため、これから選ぶ手段には含めない (ECS なら Service Connect が公式の移行先として案内されている)。

実務での活用方法は関連書籍にも詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事