⏱️

Fastly Compute HTTP リクエストの作成 (2) Readthrough Cache

2023/12/15に公開

この記事は Fastly Compute (旧 Compute@Edge) 一人アドベントカレンダー 14 日目の記事です。

Fastly Compute で最も多く利用することになるであろう HTTP リクエストの作成について紹介するシリーズ(Fastly Compute HTTP リクエストの作成)の第二回目です。本稿ではうまく使えば便利に使える(けど知らないとうっかり落とし穴にもなってしまいかねない) Readhthrough Cache を紹介します。

TL;DR fetch() や send() するとデフォルトで結果がキャッシュされる

Rust の send() や Go の Send() あるいは JavaScript の fetch()、いずれのメソッドも、Readthrough Cache と呼ばれるバックエンドとの通信の結果得られたレスポンスをキャッシュする機構がデフォルトで有効になっています。この挙動の大まかな動作フローは以下のようなイメージです。

Response として取得したコンテンツがキャッシュされるかどうかは、キャッシュの鮮度(Cache freshness)に関するセマンティクスによって決まるため、どの HTTP リクエストでも必ずコンテンツがキャッシュされるとは限りません。詳細はこちらのガイドに記載されていますが、オリジンサーバが HTTP レスポンスに付与する Cache-Control ヘッダによってその挙動が変わるため、キャッシュの振る舞いの意思決定をバックエンドのサーバに委ねている形とも言えます。

この挙動がデフォルトで有効化されているあたりは、1 msでもレイテンシを削ろうというエッジでのサーバレス開発の矜持というと大げさですが、CDN を出発点としてサーバレス開発環境として進化を遂げた Fastly Compute ならではの挙動とも言えるかもしれません。実際、パージの速度が非常に速いため、適切な箇所で使いこなすことができると体験は非常に良いです。

とはいってもキャッシュ戦略がそもそも不要な場合やアーキテクチャ上の理由で Readthrough Cache の挙動が不必要なケースも往々にしてあるので、これを無効化するイディオムも併せて紹介しておきます。

# Rust 
req.set_pass(true);

# Go
req.CacheOptions.Pass = true

# JavaScript 
# //import { CacheOverride } from "fastly:cache-override";
fetch(
  "https://example.com/some/path",
  {
    backend: "origin_0", 
    cacheOverride: new CacheOverride("pass")
  }
);

Readthrough Cache の挙動をエッジ側でも制御する

先ほど紹介したキャッシュの無効化以外にも、キャッシュは有効にしたままで TTL を短く設定しておくなど、ReadthroughCache は状況にあわせて様々な使い方ができます。HTTP リクエストを発行するタイミングで、エッジ側からオプションで指定できる項目は以下の通りです。

  • キャッシュの有効化/無効化: 詳細は前述したため省略。デフォルトで有効。
  • PCI: PCI/HIPAA に適合モードでキャッシュを動作させるかを決めるフラグ。デフォルトで無効。
  • TTL(Time-to-Live): キャッシュの有効期限を秒数で指定
  • StaleWhileRevalidate: stale-while-revalidate の時間(失効済みコンテンツのキャッシュを配信する時間)を秒数で指定
  • SurrogateKey: リクエストの surrogate key 指定をオーバーライドする場合に利用する文字列フィールド

SDK の該当部分もリファレンスとして記載しておきます。

  • Rust: set_pass(), set_stale_while_revalidate() etc (doc)
  • Go: CacheOptions.Pass (doc)
  • JavaScript: CacheOverride() (doc)

利用可能なパージ方法

公式 Web サイトに解説があるのでこれに従って確認していきます。

上表の通り、Readthrough Cache は以下 4 種類の方法でパージすることができます。

制限事項 / 注意事項

  • 本稿を執筆している 2023 年 12 月現在、Readthrough Cache はローカルのデバッグ環境($fastly compute serve や Viceroy)ではサポートされておらず、機能しないことに注意してください。(公式doc
    • なお、fiddle では fiddle 独自の Readthrough Cache の実装が入っているため cache の挙動のエミュレーションが可能です

まとめ

本稿では Readthrough Cache を使い始める時の要点に絞って概要を紹介しました。より詳しく知りたい方は、英語になりますが公式の解説も併せて参照してみてください。

明日は HTTP リクエスト作成の最終回として並列/ストリーミング処理の概要について紹介したいと思います。

Discussion