グレースフルデグラデーション
システムの一部が障害を起こしても、機能を縮退させて全体のサービスを継続する設計手法
グレースフルデグラデーションとは
グレースフルデグラデーション (Graceful Degradation) は、システムの一部が障害を起こしても、機能を縮退させて全体のサービスを継続する設計手法である。「全部動くか全部止まるか」ではなく、「一部が壊れても残りは動く」を目指す。
例: EC サイト
例: EC サイトを図で示す。
正常時:
商品表示 ✅ + レコメンド ✅ + レビュー ✅ + 在庫リアルタイム ✅
レコメンドサービス障害時:
商品表示 ✅ + レコメンド ❌ (非表示) + レビュー ✅ + 在庫リアルタイム ✅
→ 購入は可能、レコメンドだけ表示しない
在庫サービス障害時:
商品表示 ✅ + レコメンド ✅ + レビュー ✅ + 在庫 ⚠️ (キャッシュ値)
→ 最新ではないが在庫数を表示
実装パターン
障害時に代替データを返すフォールバック、キャッシュから返すキャッシュフォールバック、安全なデフォルト値を返す方法、障害のある機能を非表示にする機能の無効化、障害の伝播を防止するサーキットブレーカーがある。
Lambda での実装
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 フェイルファスト
グレースフルデグラデーションとフェイルファストの違いを以下にまとめる。
| 観点 | グレースフルデグラデーション | フェイルファスト |
|---|---|---|
| 方針 | 縮退して継続 | 即座に失敗 |
| 用途 | ユーザー向けサービス | 内部処理、データ整合性 |
| 例 | レコメンドを非表示 | 不正な入力を即座に拒否 |
設計の指針
まずコア機能 (何が止まると致命的か) を特定し、それ以外の機能は障害時に縮退できるよう依存関係を分離する。各機能のフォールバック (障害時にどう振る舞うか) を事前に設計しておくことが重要で、障害が起きてから考えるのでは遅い。設計したフォールバックが正しく動作するかは、カオスエンジニアリングで定期的に検証する。
全体像を把握するには関連書籍も有用。
この記事は役に立ちましたか?
関連用語
関連する記事
障害対応の夜に思い出す、あの本の 1 ページ
本番障害の緊迫した場面で、過去に読んだ技術書の知識が助けてくれた経験はありませんか。「いつか役立つ」知識が「今この瞬間」に変わる読書の価値を考えます。
深夜 3 時のデプロイ前に読み返したい 1 ページ
本番デプロイの直前、最終確認のチェックリストとして技術書の特定のページが役立つことがあります。緊張の場面で頼りになる「お守りの 1 ページ」の見つけ方と活用法。
バグを生むのは知識不足ではなく想像力不足である
バグの多くは、コードを書いた時点で「こういうケースもありうる」と想像できなかったことが原因です。想像力を鍛える読書法と、エッジケースへの感度を高める方法を解説します。