shiichan

Cloudflare のキャッシュが Rust 製 Pingora で生まれ変わったよ!

やっほー、しぃちゃんだよ!今日はちょっと縁の下の力持ちなお話、Cloudflare のキャッシュがまるごと新しいエンジンに載せ替わったニュースだよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Cloudflare のキャッシュが Pingora という Rust 製のプロキシフレームワークの上で動くようになったって発表があったの。Pingora はもともと Cloudflare のネットワークトラフィックのかなりの部分をさばいてきた実績のあるフレームワークで、そのキャッシュ版が新しく作られたってわけ。新しいプロキシは速くて、メモリ安全で、これからのキャッシュ設計を育てやすい形になってるんだって。

今までどうだったの?

これまでのキャッシュは別の仕組みで動いていて、機能を足したり RFC の細かい挙動に合わせたりするのがだんだん大変になってきていたの。そこを Rust ベースの Pingora に載せ替えることで、土台からきれいにして、性能も標準への準拠も一段引き上げようっていう狙いだよ。

これで何が変わるの?

  • リクエストごとのオーバーヘッドが減って、コネクション再利用が良くなって遅延が下がるよ。
  • キャッシュの保持が改善されて MISS が減って、オリジンへの負荷(オリジンオフロード)も軽くなるの。
  • キャッシュの挙動が HTTP の標準により近づくよ。
  • そして何より、これからの新機能を載せる土台ができたのが大きいの。

深く潜ってみよう

新機能として 2 つ紹介されているよ。

1 つめは非同期の stale-while-revalidate。期限切れのあと最初のリクエストがオリジンを待ってブロックしちゃうんじゃなくて、どのリクエストにも古いコンテンツをすぐ返しつつ、裏側で再検証を回す形になったの。詳しくは非同期 stale-while-revalidate の changelog にまとまってるよ。

2 つめはバイパス時の非バッファ化がデフォルトに。キャッシュをバイパスするレスポンスは、バッファせずにそのままクライアントへ流すようになって、キャッシュできないコンテンツの time-to-first-byte が短くなるんだって。

あと、RFC 準拠と正しさのために挙動の変更もあるよ。ここは既存の設定に影響することもあるから要チェックなの。

  • Vary: * が付いたレスポンスはキャッシュをバイパスするようになったよ。RFC 9110 Section 12.5.5 に沿って、* はリクエストヘッダ以外の要因で内容が変わる合図だから、キャッシュから返しちゃダメっていう扱いになったの。
  • キャッシュ可能なアセットで、Set-Cookie が HIT のときだけじゃなく MISS と EXPIRED のレスポンスでも取り除かれるようになったよ。
  • max-age=1.5 みたいな小数の TTL は、これまでは無効として弾かれていたけど、これからは近い整数に切り下げて扱われるの。

もっと詳しい解説は近いうちに Cloudflare のブログ に載るみたい。Pingora 自体の背景を知りたいなら Open sourcing PingoraHow we built Pingora が読みごたえあるよ。

まとめ

  • Cloudflare のキャッシュが Rust 製の Pingora ベースの新プロキシに移行したよ。
  • 遅延減・MISS 減・RFC 準拠の向上と、将来の機能拡張の土台づくりが狙い。
  • 新機能は非同期 stale-while-revalidate と、バイパスの非バッファ化。
  • 挙動変更として Vary: * のバイパス、MISS/EXPIRED での Set-Cookie 除去、小数 TTL の切り下げがあるよ。

自分で何かを設定しなくても勝手に速くなる話だけど、キャッシュのヘッダを細かく作り込んでいる人は挙動変更のところだけ目を通しておくと安心だよ。