mcpField
R
resilience-patterns

resilience-patterns

github.com/claude-dev-suite開発4636 回インストール3 日前に更新
リポジトリ

resilience-patterns について

耐障害性を設計する開発者向けのリファレンススキルです。TypeScript と Java の例を交え、再試行、サーキットブレーカー、タイムアウト、バルクヘッド、フォールバックを説明します。

主な機能

  1. 01指数バックオフによる再試行
  2. 02サーキットブレーカーパターン
  3. 03タイムアウト処理
  4. 04バルクヘッドとフォールバックの選択
  5. 05resilience4j の Java 例

活用シーン

  1. 01一時的なネットワークやサーバーのエラーへの対応
  2. 02障害中の依存先への反復呼び出しの抑制
  3. 03外部リクエストの長時間停止の防止
  4. 04重要な処理経路の縮退応答の設計

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill resilience-patterns

インストール後、Claude Code で/resilience-patternsを入力して読み込まれたか確認します。

詳細

レジリエンスパターン

指数バックオフを使用した再試行

async function withRetry<T>(
  fn: () => Promise<T>,
  maxRetries = 3,
  baseDelay = 1000,
): Promise<T> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error) {
      if (attempt === maxRetries) throw error;
      if (!isRetryable(error)) throw error;
      const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
      await new Promise((r) => setTimeout(r, delay));
    }
  }
  throw new Error('Unreachable');
}

function isRetryable(error: unknown): boolean {
  if (error instanceof Error && 'status' in error) {
    const status = (error as { status: number }).status;
    return status === 429 || status >= 500;
  }
  return true;
}

サーキットブレーカー

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

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

  async execute<T>(fn: () => Promise<T>, fallback?: () => T): Promise<T> {
    if (this.state === 'open') {
      if (Date.now() - this.lastFailure > this.resetTimeout) {
        this.state = 'half-open';
      } else {
        if (fallback) return fallback();
        throw new Error('Circuit breaker is open');
      }
    }

    try {
      const result = await fn();
      this.onSuccess();
      return result;
    } catch (error) {
      this.onFailure();
      if (fallback) return fallback();
      throw error;
    }
  }

  private onSuccess() { this.failures = 0; this.state = 'closed'; }
  private onFailure() {
    this.failures++;
    this.lastFailure = Date.now();
    if (this.failures >= this.threshold) this.state = 'open';
  }
}

// Usage
const breaker = new CircuitBreaker(5, 30000);
const result = await breaker.execute(
  () => externalApi.call(),
  () => cachedResult, // fallback
);

resilience4j(Java/Spring)

@CircuitBreaker(name = "paymentService", fallbackMethod = "paymentFallback")
@Retry(name = "paymentService")
@TimeLimiter(name = "paymentService")
public CompletableFuture<Payment> processPayment(Order order) {
    return CompletableFuture.supplyAsync(() -> paymentClient.charge(order));
}

public CompletableFuture<Payment> paymentFallback(Order order, Throwable t) {
    return CompletableFuture.completedFuture(Payment.pending(order.getId()));
}
# application.yml
resilience4j:
  circuitbreaker:
    instances:
      paymentService:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 30s
  retry:
    instances:
      paymentService:
        maxAttempts: 3
        waitDuration: 1s
        exponentialBackoffMultiplier: 2

タイムアウトパターン

async function withTimeout<T>(fn: () => Promise<T>, ms: number): Promise<T> {
  const controller = new AbortController();
  const timer = setTimeout(() => controller.abort(), ms);
  try {
    return await fn();
  } finally {
    clearTimeout(timer);
  }
}

パターンの選択

パターン使用する状況
再試行一時的な障害(ネットワーク、5xx、429)
サーキットブレーカー同じ依存先で障害が繰り返し発生する場合
タイムアウト接続がハングするのを防ぐ場合
バルクヘッド依存先ごとにリソースプールを分離する場合
フォールバックサービスの機能は低下していても利用可能な場合

アンチパターン

アンチパターン修正方法
冪等でない操作を再試行する冪等なリクエスト(GET、同じキーを使うPUT)のみ再試行する
再試行の遅延にジッターがないリクエストの集中を防ぐため、ランダムなジッターを追加する
リクエストごとにサーキットブレーカーを設定する(サービスごとではない)同じサービスへのリクエスト間でブレーカーインスタンスを共有する
サーキットブレーカーが開いたときのフォールバックがないキャッシュ済みまたは機能を縮小した応答を返す
400エラーを再試行する一時的なエラー(429、5xx、ネットワーク)のみ再試行する

本番環境チェックリスト

  • 指数バックオフとジッターを使用した再試行
  • すべての外部サービス呼び出しにサーキットブレーカーを設定
  • すべての送信リクエストにタイムアウトを設定
  • 重要な処理経路にフォールバック応答を設定
  • ヘルスチェックエンドポイント
  • 監視:サーキットブレーカーの状態、再試行回数

コメント