Fastly Compute HTTP リクエストの作成 (2) Readthrough Cache
この記事は 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 種類の方法でパージすることができます。
- CLI 経由でのパージ
-
$fastly purge --url=https://example.com/
のようなコマンドを実行 - あるいは、
$curl -X PURGE "https://some-foo-bar.edgecompute.app/"
のように curl 等で PURGE メソッドを直接 Compute のエンドポイントに送ることでも等価の操作が可能 (詳細)
-
- API 経由でのパージ
- UI 経由でのパージ
- 先輩社員の方の記事に詳しい解説があります
- SDK 経由でのパージ
- Rust SDK:
fastly::http::purge::purge_surrogate_key
- Go SDK:
purge.PurgeSurrogateKey
- Rust SDK:
制限事項 / 注意事項
- 本稿を執筆している 2023 年 12 月現在、Readthrough Cache はローカルのデバッグ環境(
$fastly compute serve
や Viceroy)ではサポートされておらず、機能しないことに注意してください。(公式doc)- なお、fiddle では fiddle 独自の Readthrough Cache の実装が入っているため cache の挙動のエミュレーションが可能です
まとめ
本稿では Readthrough Cache を使い始める時の要点に絞って概要を紹介しました。より詳しく知りたい方は、英語になりますが公式の解説も併せて参照してみてください。
明日は HTTP リクエスト作成の最終回として並列/ストリーミング処理の概要について紹介したいと思います。
Discussion