Skip to content

Cache Miss

エンジニア人生でやらかしたエピソードは数え切れないほどあるが、本件は印象に残っている。

大きなプロジェクトだった。秒間のアクセスはゆうに100を超え、ピークタイムには300〜500に達していた。構成はjQueryを使ったSPAに近いもので、フロントエンドからAPIを呼ぶ形だった。

その日はjQueryのアップデートだった。フロントエンドの更新なので負荷検証をすることもなく、何かあればロールバックしましょうと気軽にリリースした。

直後、全システムが落ちた。

原因はjQueryのバージョンアップで、RESTクエリに余分なGETパラメータが付与されるようになったことだった。

大規模なシステムでは、参照系は精緻なキャッシュ設計の上に成り立っている。そしていまも昔も、WebにおけるCDNのキャッシュ単位はURLの一意性だ。パラメータがひとつ増えれば、それは別のURLになる。キャッシュが効かなくなる。

キャッシュを前提とした設計のもとで、全リクエストがバックエンドへの生クエリになった。キャッシュヒット率100%を想定していたDBが、突然フルアクセスを浴びた。昇天した。

フロントエンドの変更がバックエンドを殺す。一見つながりのない場所が、キャッシュという透明な糸で結ばれていた。見えない依存は、見えないからこそ怖い。