グレースフルデグラデーションは優れたエンジニアリングパターンだ。依存サービスがダウンしたとき、安全なデフォルトにフォールバックし、イベントをログに記録し、パイプラインを継続させる。インフラにおいては正しい判断だ。
しかし、グレースフルデグラデーションと呼べないバージョンが存在する。壊れたデータ、古いキャッシュ、または現実を表すことを意図していないデフォルト値で静かに動き続けながら、正常に見える出力を生成し続けるシステムだ。パイプラインはグリーンのまま。オペレーターは何も気づかない。出力は間違っている。
それはフォールバックではない。嘘だ。
重要な区別
真のグレースフルデグラデーションには三つの特性がある:
- 障害が診断に十分なコンテキストとともにログに記録される。
- フォールバック動作が明示的である――偶発的なデフォルトではなく、意図的に選ばれたデフォルトだ。
- アラートが発火し、人間が介入するかどうかを判断できる。
サイレント障害にはそのいずれもない。システムは継続する。出力はもっともらしく見える。アラートは発火しない。オペレーターは、意思決定に使われたデータが20分前に壊れていたことを知る術がない。
違いは出力にあるのではない。出力を取り巻くオブザーバビリティにある。
「グレースフル」が「インビジブル」になる3つの本番パターン
1. スコアリングがデフォルト値を返す
リードスコアリングモデルがエンリッチメントAPIを呼び出す。APIがタイムアウトする。モデルはスコアを得られないため、フィールドの初期化値――たとえば100点中50点――を返す。これはスキーマ設定時のデフォルト値だ。
リードはスコア50でパイプラインを通過する。中優先度キューにルーティングされる。担当者は1日目ではなく3日目に対応する。
エラーはスローされなかった。アラートも発火しなかった。スコア50はモデルの出力ではなく、数値に見えたnullだった。
1日200件のリードを処理していて、15%がこのタイムアウトウィンドウに当たるとすれば、1日30件のリードが幽霊スコアでルーティングされていることになる。
2. ルーティングがデフォルトキューにフォールバックする
ルーティングエージェントがインバウンドリクエストを分類し、適切なワークフローに割り当てる。分類モデルが利用不可になる――コールドスタート、レート制限、一時的なエラーなどが原因だ。エージェントはデフォルトキューにフォールバックする。
デフォルトキュー自体は間違っていない。合理的なキャッチオールだ。しかし、それは未分類のエッジケース向けに設計されており、分類障害時のフル処理量を想定していない。モデルが40分間ダウンすると、すべてのリクエストがそのキューに流れ込む。キューが詰まる。SLAが滑る。
誰もモデルがダウンしていたことを知らない。ただ遅いキューを見て、トラフィックスパイクだと思い込む。
3. エンリッチメントが古いキャッシュを返す
エンリッチメントステップがファーモグラフィックデータ――企業規模、業種、直近の資金調達――を取得する。上流ソースが利用不可のため、システムは最後にキャッシュした値を返す。キャッシュは11日前のものだ。
その企業は9日前にシリーズBを調達した。エンリッチメントレコードにはまだシード段階と表示されている。アウトリーチのコピー、価格帯、担当者のアサイン――すべてが間違った企業情報に基づいて調整されている。
キャッシュヒットはライブデータヒットと見た目が同じだ。レコードにフラグはない。オペレーターはすべてのエンリッチメントフィールドのタイムスタンプを監査しない限り、知る方法がない。
ラウド障害が運用上より安全な理由
ラウド障害――アラート、停止したパイプライン、フラグ付きレコード――は意思決定を強制する。人間がそれを見る。依存関係を修正するか、フォールバックを明示的に承認するか、データ品質が回復するまでレコードを保留するかを判断する。
その瞬間の作業量は増える。しかし四半期単位では減る。スコアリングモデルが3週間ゴミを生成し続けた原因をデバッグする必要がなくなるからだ。
運用上の原則はシンプルだ:ラウドに失敗するシステムは、自分が何をできないかを教えてくれる。サイレントに失敗するシステムは、問題ないと嘘をつく。
ラウド障害はフィードバックループも生み出す。同じ依存関係が1週間に3回アラートを発火させれば、より良いフォールバックやより堅牢なインテグレーションへの投資が必要だとわかる。サイレント障害はそのシグナルを完全に隠す。
代わりに何を構築すべきか
パイプライン内の各フォールバックパスについて、デプロイ前に三つのことを定義せよ:
- トリガー条件。 どの具体的な障害がフォールバックを起動させるか?
- フォールバック動作。 システムは何をするか、そしてその動作は明示的に選ばれたものか、単なるデフォルトか?
- アラート。 誰が、どのチャネルで、どのコンテキストとともに通知を受けるか?
三つすべてに答えられないなら、フォールバックは完成していない。それは適切な条件を待つサイレント障害だ。
これはシステムを脆弱にする話ではない。一時的なエラーのたびに停止するパイプラインは使い物にならない。目標は、正常動作と劣化動作の境界を可視化することだ――オペレーターが四半期ごとのデータ監査で問題を発見するのではなく、情報に基づいた判断を下せるように。
退屈なシステムは静かに動く。しかしそれは、誰かが適切な場所にノイズを組み込んだからこそ静かに動いているのだ。
AIパイプラインを構築または監査していて、本番環境に現れる前に障害モードをマッピングしたい場合は、お気軽にご相談ください →