Cache Miss
エンジニア人生でやらかしたエピソードは数え切れないほどあるが、本件は印象に残っている。
大きなプロジェクトだった。秒間のアクセスはゆうに100を超え、ピークタイムには300〜500に達していた。構成はjQueryを使ったSPAに近いもので、フロントエンドからAPIを呼ぶ形だった。
その日はjQueryのアップデートだった。フロントエンドの更新なので負荷検証をすることもなく、何かあればロールバックしましょうと気軽にリリースした。
直後、全システムが落ちた。
原因はjQueryのバージョンアップで、RESTクエリに余分なGETパラメータが付与されるようになったことだった。
大規模なシステムでは、参照系は精緻なキャッシュ設計の上に成り立っている。そしていまも昔も、WebにおけるCDNのキャッシュ単位はURLの一意性だ。パラメータがひとつ増えれば、それは別のURLになる。キャッシュが効かなくなる。
キャッシュを前提とした設計のもとで、全リクエストがバックエンドへの生クエリになった。キャッシュヒット率100%を想定していたDBが、突然フルアクセスを浴びた。昇天した。
フロントエンドの変更がバックエンドを殺す。一見つながりのない場所が、キャッシュという透明な糸で結ばれていた。見えない依存は、見えないからこそ怖い。