グレースフルデグラデーションとは?解説
グレースフルデグラデーションとは、ある部分が故障したときにシステム全体が完全に崩壊するのではなく、能力を落とした状態で動作し続けるように設計することです。
レジリエントなシステムは、すべてのコンポーネントが常に利用可能だとは想定しません。グレースフルデグラデーションは、ソフトに失敗する規律です。必須でない依存先がダウンしているとき、システムはその機能を切り捨てて動作を続け、すべてを道連れにはしません。
その意味
グレースフルにデグレードするとは、破滅的にではなく、障害に比例して機能を失うことです。ライブインデックスがダウンしているときに少し古い結果を返す検索ボックスはグレースフルにデグレードしています。空のエラーページを返すものはそうではありません。ユーザーは価値の大部分を維持できます。
一般的な手法
- fallback: ライブソースが失敗したとき、cache済みまたはデフォルトの値を返します。
- feature toggle: エラーにするのではなく、重要でない機能を無効化します。
- timeoutとcircuit breaker: 依存先で素早く失敗し、処理を続行します。
- デフォルト: オプションのデータが利用できないとき、妥当なデフォルトで進めます。
デグラデーション と ハード障害
ハード障害はオールオアナッシングです。1つのコンポーネントが死ぬと、全体がエラーを返します。グレースフルデグラデーションは影響範囲を封じ込め、単一の障害が全面的な障害ではなく、小さく限定された損失を引き起こすようにします。この違いはしばしば、インシデントと非イベントとの違いになります。
CIのpipelineにおいて
pipelineもグレースフルにデグレードできます。重要でないstepを非ブロッキングにする、オプションのレポートuploadがbuildを失敗させずに失敗できるようにする、あるいはプライマリのregistryがダウンしているときにmirrorへフォールバックする、といった方法です。周辺的な部分が誤動作しても、buildは依然として本質的な結果を生成します。
Latchkey の視点
自己修復は、一時的なインフラに対するグレースフルデグラデーションの一形態です。一瞬の不調がbuildを停止させるのを許すのではなく、Latchkeyの自己修復マネージドrunnerが一時的および機械的な障害を検出して自動でretryするため、単発の瞬間的な不調があなたのbuildを失敗させることはありません。
重要なポイント
- グレースフルデグラデーションは、ある部分が故障してもシステムを部分的に動作させ続けます。
- fallback、toggle、timeout、デフォルトが一般的な手法です。
- 全面的な障害を引き起こすのではなく、影響範囲を封じ込めます。
- pipelineは、非ブロッキングのstepやmirrorによってグレースフルにデグレードします。