2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloudflare Cache と stale-while-revalidate

Posted at

やること

Cloudflare の Cache がオリジンからの stale-while-revalidate にどう反応するか、を確認。

stale-while-revalidate 拡張

[RFC 5861] The stale-while-revalidate Cache-Control Extension
   When present in an HTTP response, the stale-while-revalidate Cache-
   Control extension indicates that caches MAY serve the response in
   which it appears after it becomes stale, up to the indicated number
   of seconds.
     stale-while-revalidate = "stale-while-revalidate" "=" delta-seconds

   If a cached response is served stale due to the presence of this
   extension, the cache SHOULD attempt to revalidate it while still
   serving stale responses (i.e., without blocking).

   Note that "stale" implies that the response will have a non-zero Age
   header and a warning header, as per HTTP's requirements.

   If delta-seconds passes without the cached entity being revalidated,
   it SHOULD NOT continue to be served stale, absent other information

テスト

  • Stale 状態 (かつ stale-while-revalidate の期間内) のオブジェクトに対してリクエスト
  • Eyeball が受け取るレスポンスが Stale か Fresh かを確認
    • 以下のシーケンス図について
      • 茶色は Eyeball に Stale が返ってくる部分
      • 緑色は Eyeball に Fresh が返ってくる部分(再検証後)

結果

Cloudflare は下記の B の動きをしている。
(A への対応は Cache Reserve でも使われている Pingora 投入待ちか。)

A. Asynchronous

  • ノンブロック
  • 全部 Stale から返しとく

B. 1つ目だけ Synchronous、後続は Asynchronous

  • 1つ目は再検証でブロックされる(再検証を待つ)
  • 後続は Stale 返しとく

HTTP ヘッダー

オリジンの cache-control ヘッダー

cache-control: max-age=60, stale-while-revalidate=30
etag: あり
last-modified: あり

cache-control ヘッダーについて → Mdn

Cloudflare Cache の返す cf-cache-status ヘッダー

Eyeball が受け取ったレスポンスが Stale か Fresh かを判断する一つとして cf-cache-status を確認する。

cf-cache-status ヘッダーについて → Cloudfalre

オリジンのオブジェクトに変更がないとき

ETag 同じ。

  • Eyeball A(1つ目)が受ける cf-cache-status は REVALIDATED
  • Eyeball B(2つ目)が受ける cf-cache-status は UPDATING

オリジンのオブジェクトに変更があるとき

ETag 変わる。

  • Eyeball A(1つ目)が受ける cf-cache-status は EXPIRED
  • Eyeball B(2つ目)が受ける cf-cache-status は UPDATING

stale-while-revalidate を無視する設定

Cache Rules を使って、stale-while-revalidate を無視する設定にしたときの動作。

Serve Stale Content
Enable or disable serving stale content while updating from the origin server. If serving stale content is disabled, origin cache-control headers will be used to tell Cloudflare how to handle content from the origin.

Screenshot 2023-07-03 at 21.25.21.png

オリジンのオブジェクトに変更がないとき

オリジンのオブジェクトに変更があるとき

テスト環境メモ

  • Stale 状態のコンテンツを吐くため、オリジンに遅延を入れた(tc) 。
    遅延なしだとオリジンからのレスポンスが早く届き、2発目へのレスポンスは Fresh で cf-cache-status: HIT だった。
  • リクエストパスに対する Origin Cache-control 設定は無効
    有効にしても結果変わらず(エンタープライズプランではデフォルト無効
  • Edge Cache TTL は設定しない

Link

Cloudflare Community: when-will-cloudflare-fully-support-stale-while-revalidate-with-asynchronous-background-revalidation
Google
Fastly

その他

オリジンへのリクエスト抑制の対策として、Tiered Cache の early eviction でおこぼれした場合の備えは Cache Reserve が使える。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?