Skip to content
所有文章 ‹ Part 12 of 18 · Cache 不是方塊,是一條鏈
工程 · 2 min read

三個地方都在設定 TTL

一個檔案的 TTL 在三個地方設定:bucket metadata、LB cache 和 CDN 規則。TTL 途中只會被壓低,而 IaC 裡的空白代表預設值。

一個檔案的 TTL 不是一個地方決定的。三層各有設定,TTL 從 storage 一路傳到 client,途中只會被壓低。

我原本以為 TTL 只在 CDN 上設定。追下去才發現,路上有三個地方都在決定它。

① bucket 物件 metadata Cache-Control 沒設→ 預設 max-age=3600 ② LB cache 設定 client TTL 上限 3600→ 往外傳的 max-age 最多 3600 ③ Akamai 規則 預設 30 天,但遵守origin 傳來的 max-age browser 拿到 Akamai 副本剩下的秒數
TTL 從 bucket 經過三層設定傳到 browser,每一層都只會把它壓低。

每一層的設定

層設定我們的值
① Bucket物件的 Cache-Control metadata上傳時沒設,bucket 回 public, max-age=3600
② LB cachecache mode快取所有靜態檔案
default TTL / client TTL 上限 / max TTL3600 / 3600 / 86400
stale-while-revalidate 時間86400(Stale-while-revalidate:先回舊檔,背景再刷新)
③ Akamaicaching 行為遵守 Cache-Control 和 Expires,預設 30 天
  • 在「快取所有靜態檔案」模式下,client TTL 上限就是 LB cache 往外傳的 max-age 上限。
  • 所以就算上傳時設了 30 天,經過 proxy 路線到 Akamai 時,最多還是 3600 秒。
  • 「只會被壓低」的前提是 Akamai 遵守收到的 max-age。Akamai 改成固定 TTL 時,最靠近 client 的它可以蓋掉後面的值(Cache 的新鮮度:fresh、stale 和 304)。
  • LB cache 會改寫這個 header:bucket 回 public, max-age=3600,經過它變成 public,max-age=3600。

沒寫設定,不代表沒有設定

我們用 IaC(Infrastructure as Code)管理設定。裡面沒寫 LB cache 的規則,我就以為它沒有規則。但只要 cache 開著,它就一定有一整套預設值。我直接向雲端平台查詢,才讀到真正的值。

IaC 裡的空白不是「沒有」,而是「預設」。

參考來源:RFC 9111: HTTP Caching

延伸閱讀:Cache 的新鮮度:fresh、stale 和 304、Cache header:誰設定,誰讀取、一個 request 走過的路、Stale-while-revalidate:先回舊檔,背景再刷新、我學到的:cache 不是一個方塊,是一條鏈。或回到系列總覽。

↑↓ 移動 ↵ 開啟 esc 關閉