# 4.3 フェイルオーバー

## 機能説明

フェイルオーバー機能は、メインプロバイダーのリクエストが失敗した場合に、自動的にバックアッププロバイダーに切り替えてサービスの中断を防ぎます。

**適用シーン**：
- プロバイダーのサービスが不安定な場合
- 高可用性が必要な場合
- 長時間実行するタスク

## 前提条件

フェイルオーバー機能を使用するには：

1. プロキシサービスを起動
2. アプリケーション接管を有効化
3. フェイルオーバーキューを設定
4. 自動フェイルオーバーを有効化

## フェイルオーバーキューの設定

### 設定ページを開く

設定 → 詳細 → フェイルオーバー

### アプリの選択

ページ上部に 3 つのタブがあります：
- Claude
- Codex
- Gemini

設定するアプリを選択します。

### バックアッププロバイダーの追加

1. 「フェイルオーバーキュー」エリアで
2. 「プロバイダーを追加」をクリック
3. ドロップダウンリストからプロバイダーを選択
4. プロバイダーがキューの末尾に追加

### 優先順位の調整

プロバイダーをドラッグして順序を調整：
- 番号が小さいほど優先度が高い
- メインプロバイダーが失敗すると、順番にバックアッププロバイダーを試行

### プロバイダーの削除

プロバイダーの右側にある「削除」ボタンをクリックします。

## メイン画面でのクイック操作

プロキシとフェイルオーバーがどちらも有効な場合、プロバイダーカードにフェイルオーバースイッチが表示されます。

### キューに追加

1. プロバイダーカードを見つける
2. フェイルオーバースイッチをオンにする
3. プロバイダーが自動的にキューに追加

### キューから削除

1. プロバイダーカードのフェイルオーバースイッチをオフにする
2. プロバイダーがキューから削除

## 自動フェイルオーバーの有効化

### 操作手順

1. フェイルオーバー設定ページで
2. 「自動フェイルオーバー」スイッチをオンにする

### スイッチの説明

| 状態 | 動作 |
|------|------|
| オフ | 失敗を記録するのみ、自動切り替えなし |
| オン | 失敗時に自動的に次のプロバイダーに切り替え |

## フェイルオーバーのフロー

```mermaid
graph TD
    Start[リクエストがプロキシに到達] --> Send[現在のプロバイダーに送信]
    Send --> CheckSuccess{成功？}
    CheckSuccess -- はい --> Return[レスポンスを返却]
    CheckSuccess -- いいえ --> LogFail[失敗を記録]
    LogFail --> CheckCircuit{サーキットブレーカーの状態確認}
    CheckCircuit -- 発動中 --> Skip[このプロバイダーをスキップ]
    CheckCircuit -- 未発動 --> IncFail[失敗カウントを増加]
    Skip --> Next{キューに次がある？}
    IncFail --> Next
    Next -- あり --> Switch[プロバイダーを切り替え]
    Switch --> Retry[リクエストをリトライ]
    Retry --> Send
    Next -- なし --> Error[エラーを返却]
```

## サーキットブレーカーの設定

サーキットブレーカーは、失敗したプロバイダーへの頻繁なリトライを防止します。

### 設定項目

アプリごとに独立したデフォルト設定があります。以下は共通のデフォルト値で、Claude には独自の緩やかな設定があります。

| 設定 | 説明 | 共通デフォルト | Claude デフォルト | 範囲 |
|------|------|--------|--------|------|
| 失敗閾値 | 連続何回失敗でサーキットブレーカーが発動 | 4 | 8 | 1-20 |
| 復旧成功閾値 | ハーフオープン状態で何回成功したら閉じるか | 2 | 3 | 1-10 |
| 復旧待機時間 | サーキットブレーカー発動後の復旧試行までの時間（秒） | 60 | 90 | 0-300 |
| エラー率閾値 | この値を超えるとサーキットブレーカーが発動 | 60% | 70% | 0-100% |
| 最小リクエスト数 | エラー率計算前の最小リクエスト数 | 10 | 15 | 5-100 |

> Claude はリクエストに時間がかかるため、デフォルト設定はより緩やかで、多くの失敗を許容します。

### タイムアウト設定

| 設定 | 説明 | 共通デフォルト | Claude デフォルト | 範囲 |
|------|------|--------|--------|------|
| ストリーム初バイトタイムアウト | 最初のデータチャンクの最大待機時間（秒） | 60 | 90 | 1-120 |
| ストリームサイレントタイムアウト | データチャンク間の最大間隔（秒） | 120 | 180 | 60-600（0 で無効化） |
| 非ストリームタイムアウト | 非ストリームリクエストの総タイムアウト時間（秒） | 600 | 600 | 60-1200 |

### リトライ設定

| 設定 | 説明 | 共通デフォルト | Claude デフォルト | 範囲 |
|------|------|--------|--------|------|
| 最大リトライ回数 | リクエスト失敗時のリトライ回数 | 3 | 6 | 0-10 |

> Gemini のデフォルト最大リトライ回数は 5 です。

### サーキットブレーカーの状態

| 状態 | 説明 |
|------|------|
| 閉（Closed） | 正常状態、リクエストを許可 |
| 開（Open） | サーキットブレーカー発動中、このプロバイダーをスキップ |
| 半開（Half-Open） | 復旧試行中、探査リクエストを送信 |

### 状態遷移

```mermaid
stateDiagram-v2
    [*] --> Closed: 初期化
    Closed --> Open: 失敗回数 >= 閾値
    Open --> HalfOpen: サーキットブレーカー期間満了
    HalfOpen --> Closed: 探査成功 (>= 復旧閾値)
    HalfOpen --> Open: 探査失敗
```

## ヘルスステータスの表示

### プロバイダーカード

カードにヘルスステータスバッジが表示されます：

| バッジ | 状態 | 説明 |
|------|------|------|
| 緑 | 健康 | 連続失敗回数 0 |
| 黄 | 警告 | 失敗はあるがサーキットブレーカー未発動 |
| 赤 | サーキットブレーカー発動 | 一時的にスキップ |

### キューリスト

フェイルオーバーキューにも各プロバイダーのヘルスステータスが表示されます。

## フェイルオーバーログ

各フェイルオーバーの記録内容：

| 情報 | 説明 |
|------|------|
| 時間 | 発生時刻 |
| 元のプロバイダー | 失敗したプロバイダー |
| 新しいプロバイダー | 切り替え先のプロバイダー |
| 失敗理由 | エラー情報 |

使用量統計のリクエストログで確認できます。

## ベストプラクティス

### キュー設定のアドバイス

1. **メインプロバイダー**：最も安定で高速なプロバイダー
2. **第 1 バックアップ**：次善の選択
3. **第 2 バックアップ**：最後の手段

### サーキットブレーカー設定のアドバイス

| シーン | 失敗閾値 | サーキットブレーカー期間 |
|------|----------|----------|
| 高可用性要件 | 2 | 30 秒 |
| 一般的なシーン | 3 | 60 秒 |
| 偶発的な失敗を許容 | 5 | 120 秒 |

### 監視のアドバイス

定期的に確認：
- 各プロバイダーのヘルスステータス
- フェイルオーバーの発生頻度
- サーキットブレーカーの発動状況

## よくある質問

### フェイルオーバーがトリガーされない

確認事項：
1. プロキシサービスが実行中か
2. アプリケーション接管が有効か
3. 自動フェイルオーバーが有効か
4. キューにバックアッププロバイダーがあるか

### フェイルオーバーが頻繁にトリガーされる

考えられる原因：
- メインプロバイダーが不安定
- ネットワークの問題
- 設定のエラー

解決方法：
- メインプロバイダーの状態を確認
- サーキットブレーカーのパラメータを調整
- メインプロバイダーの変更を検討

### すべてのプロバイダーがサーキットブレーカー発動中

サーキットブレーカー期間満了後に自動復旧を待つか、以下を実行：
1. プロキシサービスを手動で再起動
2. サーキットブレーカーの状態をリセット
