Cloudflare Workers Cache: Edge Caching for Serverless Origins

Cloudflare Workers Cache: Edge Caching for Serverless Origins

Cloudflare 推出了 Workers Cache,這是一個直接位於 Worker 前方的分層快取系統。這種架構允許 Cloudflare 在不調用 Worker 的情況下提供快取回應,從而消除快取命中時的 CPU 計費,並降低終端用戶的延遲。

架構轉變:Worker 作為 Origin

從過去來看,Cloudflare Workers 位於快取和 origin 之前。這對於在請求到達快取 origin 之前進行請求轉換、URL 重寫或 A/B 測試非常理想。然而,隨著 Astro、Next.js、Remix 和 SvelteKit 等現代框架越來越多地將 Workers 作為主要伺服器(即 origin)使用,舊有的模型意味著每個請求都會觸發 Worker 調用,即使是對於相同的回應。

Workers Cache 翻轉了這個模型。透過將快取置於 Worker 之前,Cloudflare 現在可以直接從邊緣(edge)提供回應。如果存在新鮮的快取回應,Worker 就不會執行,也不會產生 CPU 時間計費。如果發生快取未命中(miss),Worker 會執行一次,填充快取,隨後的請求將在全球範圍內從快取中提供服務。

關鍵技術特性

標準化 HTTP 控制

Workers Cache 透過 wrangler.jsonc 中的單行配置進行設定,並使用標準 HTTP 表頭來管理:

  • Cache-Control: 定義 TTL (Time-to-Live) 和快取行為。
  • stale-while-revalidate: 允許 Cloudflare 在背景刷新內容的同時立即提供過時(stale)的回應,確保用戶從不等待重新渲染。
  • Vary: 啟用內容協商。Cloudflare 會根據指定的請求表頭(例如 Accept-LanguageAccept-Encoding)存儲不同的快取變體,確保為每個客戶端提供正確的表示形式。
  • Cache-Tag: 允許透過 ctx.cache.purge() 進行程式化且細粒度的特定內容組別失效化。

分層區域快取

每個啟用了快取的 Worker 預設都會使用兩層拓撲結構:

  1. 下層 (Lower Tier): 位於最靠近用戶的數據中心。
  2. 上層 (Upper Tier): 一個區域聚合器,用於填充下層。

這種結構確保了世界任何地方的第一個請求都會填充上層,與扁平快取相比,這能顯著提高整個網路的範圍內的快取命中率。

使用 ctx.props 的多租戶安全性

為了支持身份驗證或用戶特定的數據,Workers Cache 與 ctx.props 整合。當 Worker 透過 service binding 調用時,傳遞在 ctx.props 中的任何識別碼(例如 userIdtenantId)都會成為快取鍵(cache key)的一部分。這可以防止用戶間的數據洩漏,同時仍允許將身份驗證後的回應快取在邊緣。

進階組合模式

由於 Workers Cache 位於每個 Worker 入口點(包括命名的 WorkerEntrypointctx.exports 調用)之前,開發者可以將應用程式構建為一系列記憶化(memoized)階段的鏈條:

  • Gateway Stage: 一個外部入口點(禁用快取)來處理身份驗證和請求正規化。
  • Backend Stage: 一個內部入口點(啟用快取)來執行昂貴的數據獲取和渲染。

這允許「gateway」在每個請求上運行以確保安全性,而「backend」僅在快取未命中時運行。這種模式可以擴展到包裝 Durable Objects 或透過在請求到達快取的入口點之前剝離追蹤參數來將 URL 正規化。

計費與可觀測性

計費模型

快取命中會透過消除 CPU 時間費用來降低成本,儘管它們仍會產生標準的 Workers 請求率費用。

Outcome Request Charge CPU Time Charge
Cache HIT Standard Rate Not Billed
Cache MISS MISS Billed
Cache BYPASS Standard Rate Billed

注意: 以前是免費的請求——例如靜態資產請求和 worker-to-worker 調用——在啟用快取時現在會按標準請求率計費,因為它們必須諮詢快取。

可觀測性

快取性能已整合到 Workers Observability 控制面板中,提供每次調用的命中、未命中、更新(SWR)和繞過(bypass)數據,以幫助開發者調整其 max-agestale-while-revalidate 設定。

社群觀點

雖然技術實現因其對 HTTP 標準的遵循而受到讚賞,但一些社群成員對計費變更表示了擔憂:

"You now get billed for static asset requests! This makes no sense to me... it sounds like a bug that just happens to generate them more money."

其他成員強調了該功能對伺服器端渲染 (SSR) 性能的重要性:

"A big worry was always 'why does workers sit in front of my cache? that's a waste of an invocation if i'm returning a cached result'"

框架整合

Workers Cache 已透過 cacheCloudflare 提供者整合到 Astro Cloudflare adapter 中,允許開發者直接在 Astro 配置中為 routeRules 定義 maxAgeswr

Sources