第79条
フォールバックを避ける
フォールバック経路は何かがすでに失敗したあとでしか動かない。だから、システムでいちばん試されていないコードが最悪の条件で動く。
心得
壊れたときにしか動かないコードを信用しない
どうするか
フォールバックを足す前に、同じ労力で主経路の可用性を上げられないかを考える。リクエストのたびに取りに行く代わりに呼び出し側へ前もってデータをプッシュしておく、冗長化する、といった方法がある。フォールバックを残すなら、障害時だけでなく本番で常に動かし、その出力を主経路と同等に正当なデータ源として扱う。誰も動かしたことのないフォールバック経路は消す。
なぜ起きるか
フォールバックのコードは平常時には使われないので、そのバグも、容量の限界も、データが古くなっていることも、必要になるまで誰も気づかない。そのコードが、障害の最中、つまり負荷がいつもと違い、ほかの部分も劣化しているときに動き出し、すでに挙動のおかしいシステムに新しい動作モードを一つ加える。キャッシュを迂回してデータベースへ直接向かうフォールバックや、予備のサービスに切り替えるフォールバックは、その負荷を想定していない場所に負荷を移し、部分的な障害を広げることがある。2001年頃の Amazon.com の障害はそうして始まった。Amazon は、その労力はたいてい主経路の可用性を上げるほうに使ったほうがよいと結論づけている。
実際にあったこと
2023年11月2日、Cloudflare のポートランドの主要データセンターで電源が落ち、コントロールプレーンと分析機能が止まった。Cloudflare は欧州の災害復旧サイトに切り替えたが、この退避がその規模で試されたことはなかった。「PDX-04 の施設全体を落とす試験はしたことがなかった」うえ、一部の新しい製品には試験済みの復旧手順がなく、ログ処理は復旧サイトでそもそも動かず、立ち上がったサービスにはクライアントの再試行が殺到した。完全な復旧は11月4日までかかった。
記録を読む当てはまらなくなるとき
グレースフル・デグラデーション:縮退した経路が普段から動いているなら、エラーを返すより縮退した答えを返すほうがよい。おすすめ欄が、普段から出している固定リストに切り替える場合などだ。危ないのは縮退そのものではなく、普段一度も動かない経路のほうだ。
出典
Jacob Gabrielson『Avoiding fallback in distributed systems』(Amazon Builders' Library, 2019)。キャッシュが一斉に落ちてすべての Web サーバがデータベースへ直接問い合わせた、2001 年頃の Amazon.com の障害と、"At Amazon, we avoid fallback in our systems because it's difficult to prove and its effectiveness is hard to test." の出典。
原典を読む