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-Language或Accept-Encoding)存儲不同的快取變體,確保為每個客戶端提供正確的表示形式。Cache-Tag: 允許透過ctx.cache.purge()進行程式化且細粒度的特定內容組別失效化。
分層區域快取
每個啟用了快取的 Worker 預設都會使用兩層拓撲結構:
- 下層 (Lower Tier): 位於最靠近用戶的數據中心。
- 上層 (Upper Tier): 一個區域聚合器,用於填充下層。
這種結構確保了世界任何地方的第一個請求都會填充上層,與扁平快取相比,這能顯著提高整個網路的範圍內的快取命中率。
使用 ctx.props 的多租戶安全性
為了支持身份驗證或用戶特定的數據,Workers Cache 與 ctx.props 整合。當 Worker 透過 service binding 調用時,傳遞在 ctx.props 中的任何識別碼(例如 userId 或 tenantId)都會成為快取鍵(cache key)的一部分。這可以防止用戶間的數據洩漏,同時仍允許將身份驗證後的回應快取在邊緣。
進階組合模式
由於 Workers Cache 位於每個 Worker 入口點(包括命名的 WorkerEntrypoint 和 ctx.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-age 和 stale-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 定義 maxAge 和 swr。