CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-03-27上級

Claude API プロダクション耐障害設計パターン — モデルルーティング・サーキットブレーカー・フォールバック戦略の実装ガイド

Claude APIを本番運用で支える耐障害設計の実装パターン。サーキットブレーカー、モデルルーティング、フォールバックチェーン、リトライ戦略、ディザスタリカバリをTypeScriptの実装コードと、Dolice Labs 4サイト並行運用で得た運用知見で整理しました。

api38production87resilience8circuit-breaker3retry6fallback7error-handling10typescript11

プレミアム記事

Claude APIを本番プロダクションで運用していると、必ず直面するのが「障害にどう備えるか」という課題です。レート制限による一時的なエラー、モデルの応答遅延、サービス全体の一時停止——これらの障害は避けられません。しかし、適切な耐障害設計(Resilience Engineering)を施すことで、ユーザーへの影響を最小限に抑え、システム全体の可用性を99.9%以上に維持できます。

なぜLLMアプリケーションに耐障害設計が必要なのか

従来のWeb APIと比べて、LLMアプリケーションには特有の障害パターンがあります。

まず、応答時間の不確実性です。Claude APIの応答時間はプロンプトの複雑さやモデルの負荷状況によって数百ミリ秒から数十秒まで大きく変動します。固定タイムアウトでは対応しきれないケースが頻繁に発生します。

次に、レート制限のカスケード障害です。一つのリクエストがレート制限に達すると、後続のリクエストも連鎖的に失敗し、システム全体のスループットが急激に低下する「カスケード障害」が起きやすくなります。

さらに、コスト爆発リスクがあります。リトライ戦略を誤ると、障害時に無駄なAPIコールが急増し、コストが予想外に膨らむ危険性があります。

これらの課題に対して、本記事で紹介する5つのパターンを組み合わせることで、堅牢なプロダクションシステムを構築できます。なお、基本的なエラーハンドリングについてはClaude API エラーハンドリングとリトライ戦略で解説していますので、ここではその先のプロダクション設計に踏み込みます。

サーキットブレーカーパターンの実装

サーキットブレーカーは、連続的な障害を検出すると自動的にリクエストを遮断し、システム全体への障害伝播を防ぐパターンです。電気回路のブレーカーと同じ考え方で、Open(遮断)・Closed(通常)・Half-Open(試行)の3つの状態を持ちます。

// circuit-breaker.ts — Claude API用サーキットブレーカー実装
interface CircuitBreakerConfig {
  failureThreshold: number;    // Open状態に遷移する連続失敗回数
  resetTimeout: number;        // Open → Half-Open への待機時間(ms)
  halfOpenMaxAttempts: number;  // Half-Open 状態での最大試行回数
  monitorWindow: number;       // 失敗カウントのウィンドウ期間(ms)
}
 
type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
 
class ClaudeCircuitBreaker {
  private state: CircuitState = 'CLOSED';
  private failureCount = 0;
  private lastFailureTime = 0;
  private halfOpenAttempts = 0;
  private successCount = 0;
 
  constructor(
    private config: CircuitBreakerConfig = {
      failureThreshold: 5,
      resetTimeout: 30_000,
      halfOpenMaxAttempts: 3,
      monitorWindow: 60_000,
    }
  ) {}
 
  async execute<T>(fn: () => Promise<T>): Promise<T> {
    // Open状態: リクエストを即座に拒否
    if (this.state === 'OPEN') {
      if (Date.now() - this.lastFailureTime >= this.config.resetTimeout) {
        this.transitionTo('HALF_OPEN');
      } else {
        throw new CircuitOpenError(
          `Circuit is OPEN. Retry after ${this.remainingResetTime()}ms`
        );
      }
    }
 
    // Half-Open状態: 試行回数を制限
    if (this.state === 'HALF_OPEN' &&
        this.halfOpenAttempts >= this.config.halfOpenMaxAttempts) {
      this.transitionTo('OPEN');
      throw new CircuitOpenError('Half-open attempts exhausted');
    }
 
    try {
      if (this.state === 'HALF_OPEN') this.halfOpenAttempts++;
      const result = await fn();
      this.onSuccess();
      return result;
    } catch (error) {
      this.onFailure();
      throw error;
    }
  }
 
  private onSuccess(): void {
    if (this.state === 'HALF_OPEN') {
      this.successCount++;
      // Half-Open で2回連続成功 → CLOSED に復帰
      if (this.successCount >= 2) {
        this.transitionTo('CLOSED');
      }
    }
    this.failureCount = 0;
  }
 
  private onFailure(): void {
    this.failureCount++;
    this.lastFailureTime = Date.now();
 
    if (this.state === 'HALF_OPEN') {
      // Half-Open での失敗は即座に OPEN へ
      this.transitionTo('OPEN');
    } else if (this.failureCount >= this.config.failureThreshold) {
      this.transitionTo('OPEN');
    }
  }
 
  private transitionTo(newState: CircuitState): void {
    console.log(`[CircuitBreaker] ${this.state} → ${newState}`);
    this.state = newState;
    if (newState === 'CLOSED') {
      this.failureCount = 0;
      this.successCount = 0;
    } else if (newState === 'HALF_OPEN') {
      this.halfOpenAttempts = 0;
      this.successCount = 0;
    }
  }
 
  private remainingResetTime(): number {
    return Math.max(
      0,
      this.config.resetTimeout - (Date.now() - this.lastFailureTime)
    );
  }
 
  getState(): CircuitState {
    return this.state;
  }
}
 
class CircuitOpenError extends Error {
  constructor(message: string) {
    super(message);
    this.name = 'CircuitOpenError';
  }
}
 
// 使用例
const breaker = new ClaudeCircuitBreaker({
  failureThreshold: 5,
  resetTimeout: 30_000,   // 30秒後に再試行
  halfOpenMaxAttempts: 3,
  monitorWindow: 60_000,
});
 
const result = await breaker.execute(async () => {
  // → Anthropic SDK の呼び出し
  return await anthropic.messages.create({
    model: 'claude-sonnet-4-6',
    max_tokens: 1024,
    messages: [{ role: 'user', content: 'Hello' }],
  });
});
// 期待出力: 正常時はAPIレスポンス、障害時はCircuitOpenError

ポイントは、monitorWindow を設定して一定期間内の失敗のみをカウントすることです。古い障害を永久に引きずってしまうと、一時的なネットワーク障害だけでブレーカーが頻繁に動作してしまいます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
サーキットブレーカー閾値5/30秒・モデル別レイテンシSLO閾値などの具体パラメータと用途別のチューニング表
Cloudflare Workers の CPU 30秒制限下で ResilienceManager を分割する設計判断と Cron Triggers + Durable Objects への退避パターン
Dolice Labs 4サイト並行運用で実測した RTO/RPO の収益逆算表と Supervisor を Sonnet → Haiku に切り替えて月額¥600 →¥150 まで圧縮した実例
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-05-23
Claude API の 529 Overloaded を本番アプリで吸収する — レジリエンス実装パターン
529 Overloaded は単発のリトライでは止まりません。累計5,000万DLのアプリ運用で踏んできた失敗を踏まえ、ユーザー体験を落とさずに吸収するためのキュー化・モデル切替・フォールバック設計をコード付きで整理します。
API & SDK2026-04-23
Claude API の高可用性設計 — Sonnet / Haiku / Opus マルチモデルフォールバックを本番で成立させる
Claude API を単一モデル前提で組むと、障害やレート制限の瞬間にサービス全体が止まります。Sonnet・Haiku・Opus を段階的にフォールバックする本番実装を、コード・Circuit Breaker・ストリーミング対応まで含めて整理しました。
API & SDK2026-03-31
Claude API で自己修復型AIエージェントを構築する — エラー検出・自動リカバリ・グレースフルデグラデーションの本番実装パターン
Claude API を活用して、障害を自動検出・自己修復する本番向けAIエージェントを構築する方法を解説。リトライ戦略、フォールバック、Supervisor パターン、可観測性の実装を網羅します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →