グレースフルデグラデーション
システムの一部が障害を起こしても、機能を縮退させて全体のサービスを継続する設計手法
耐障害性設計
グレースフルデグラデーションとは
グレースフルデグラデーション (Graceful Degradation) は、システムの一部が障害を起こしても、機能を縮退させて全体のサービスを継続する設計手法である。「全部動くか全部止まるか」ではなく、「一部が壊れても残りは動く」を目指す。
例: EC サイト
正常時:
商品表示 ✅ + レコメンド ✅ + レビュー ✅ + 在庫リアルタイム ✅
レコメンドサービス障害時:
商品表示 ✅ + レコメンド ❌ (非表示) + レビュー ✅ + 在庫リアルタイム ✅
→ 購入は可能、レコメンドだけ表示しない
在庫サービス障害時:
商品表示 ✅ + レコメンド ✅ + レビュー ✅ + 在庫 ⚠️ (キャッシュ値)
→ 最新ではないが在庫数を表示
実装パターン
障害時に代替データを返すフォールバック、キャッシュから返すキャッシュフォールバック、安全なデフォルト値を返す方法、障害のある機能を非表示にする機能の無効化、障害の伝播を防止するサーキットブレーカーがある。
Lambda での実装
async function getRecommendations(userId: string): Promise<Product[]> {
try {
return await recommendationService.get(userId);
} catch (e) {
console.warn('Recommendation service unavailable, returning fallback');
return await getPopularProducts(); // フォールバック: 人気商品を返す
}
}
async function getInventory(productId: string): Promise<number> {
try {
return await inventoryService.get(productId);
} catch (e) {
const cached = await cache.get(`inventory:${productId}`);
if (cached) return cached; // キャッシュから返す
return -1; // 在庫不明を示す
}
}
グレースフルデグラデーション vs フェイルファスト
| 観点 | グレースフルデグラデーション | フェイルファスト |
|---|---|---|
| 方針 | 縮退して継続 | 即座に失敗 |
| 用途 | ユーザー向けサービス | 内部処理、データ整合性 |
| 例 | レコメンドを非表示 | 不正な入力を即座に拒否 |
設計の指針
まずコア機能 (何が止まると致命的か) を特定し、それ以外の機能は障害時に縮退できるよう依存関係を分離する。各機能のフォールバック (障害時にどう振る舞うか) を事前に設計しておくことが重要で、障害が起きてから考えるのでは遅い。設計したフォールバックが正しく動作するかは、カオスエンジニアリングで定期的に検証する。
全体像を把握するには関連書籍も有用。