Featured image of post CDN 快取策略:最大化效能和新鮮度Featured image of post CDN 快取策略:最大化效能和新鮮度

CDN 快取策略:最大化效能和新鮮度

CDN 快取策略的綜合指南,涵蓋快取控制指令、代理鍵、失效、重新驗證時過時、清除和來源屏蔽。

介紹

內容交付網路 (CDN) 是現代 Web 效能的支柱。透過在全球分佈的邊緣節點快取內容,CDN 大大減少了延遲並卸載了來源伺服器的流量。然而,有效的快取並不僅僅是啟用 CDN 然後就忘記它的問題。在效能(高快取命中率和低延遲)與新鮮度(最小陳舊性和快速失效)之間取得適當的平衡需要深思熟慮的策略。

本指南探討了 CDN 快取基礎、快取控制指令、代理鍵、失效策略、重新驗證時過時、多層快取和監控,提供您現在可以應用的實用方法。


CDN 快取基礎知識

CDN 快取在邊緣節點儲存回應副本(存在積分或 POP),因此可以在不聯繫來源伺服器的情況下處理對相同資源的後續請求。 快取命中時,回應將在 5-50 毫秒內提供。當快取未命中時,請求將傳輸到來源,從而增加 100-500 毫秒的延遲。

CDN 快取各種內容:靜態資產(圖片、CSS、JavaScript、字型)、API 回應(JSON、GraphQL)、HTML 頁面和串流內容。快取層次結構通常遵循邊緣節點→地方快取→來源屏蔽→來源伺服器。

不同的 CDN 提供者有不同的快取理念和功能:

供應商快取控制代理鍵起源之盾SWR 支援
雲耀完整快取標籤Argo 分層快取是的
快點完整代理鍵快速盾是的
阿卡邁完整快取標籤物業經理是的
雲前完整起源之盾是的

深度快取控制指令

Cache-Control 標頭是指示 CDN 和瀏覽器如何快取回應的主要機制。了解其指令對於微調行為至關重要。

  • max-age=<seconds> — 指定資源保持新鮮的時間。對於像 app.a1b2c3.js 這樣的版本化資產,請使用 immutable 指令設定 max-age=31536000
  • s-maxage=<seconds> — 專門針對共用快取(CDN 和代理程式)覆寫 max-age,讓您可以為 CDN 與瀏覽器設定不同的 TTL。
  • publicprivatepublic 允許透過 CDN 和瀏覽器進行快取; private 僅將快取限制在瀏覽器中,這對於特定於使用者的內容很重要。
  • no-cacheno-storeno-cache 允許緩存,但需要對每個請求重新驗證。 no-store 完全禁止快取。
  • stale-while-revalidate=<seconds> — 立即提供過時的內容,同時在背景取得新內容。
  • immutable — 告訴瀏覽器資源在其新鮮生命週期內永遠不會改變,從而消除了條件重新驗證。

以下是針對不同內容類型的實用秘訣:

# Versioned static asset — cache for a year, skip revalidation
Cache-Control: public, max-age=31536000, immutable

# API response — fresh for 1 minute, stale for 24 hours
Cache-Control: public, s-maxage=60, stale-while-revalidate=86400

# HTML page — always revalidate
Cache-Control: public, no-cache

代理鍵和定向失效

代理鍵(也稱為原始快取標籤)可讓您對相關資源進行分組,以實現目標快取失效。您無需清除單個 URL,而是按標籤進行清除——對於分組內容來說,這是一種更有效的方法。

實作很簡單:您的來源伺服器在回應中包含 Surrogate-Key 標頭(Fastly)或 Cache-Tag 標頭(Cloudflare、Akamai)。標籤可以表示內容類型 (articles)、特定實體 (article:1234)、集合 (section:tech) 或操作 (purge-all)。

# Response header tagging an article
Cache-Tag: articles, article:1234, section:tech

更新文章時,清除所有標記有該 ID 的快取回應:

# Fastly surrogate key purge
curl -X POST "https://api.fastly.com/service/{service}/purge/article:1234" \
  -H "Fastly-Key: $API_KEY"

# Cloudflare tag purge
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone}/purge_cache" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tags":["article:1234"]}'

標籤命名的最佳實踐:避免空格,保持大小寫一致,並將每個回應的標籤限制為少於 256 個,以保持在提供者的限制範圍內。


重新驗證時過時

Stale-While-Revalidate (SWR) 是一種快取控制擴展,它將快取未命中懲罰從同步等待轉變為背景刷新。當對過時資源的請求到達時,CDN 立即提供過時版本,同時非同步取得新版本。

Cache-Control: public, max-age=60, stale-while-revalidate=86400

這可以使資源保持新鮮 60 秒,並允許提供陳舊內容長達 24 小時,同時在後台重新驗證。用戶看到零等待時間——他們總是得到即時回應。 SWR 與 stale-if-error 配合得很好,當來源無法存取時,它可以將過時的內容作為後備。 在 CDN 儀表板中顯示陳舊與新鮮的比率,以適當調整 SWR 視窗。


多層快取和 Origin Shield

有效的快取在多個層上運作:

  1. 瀏覽器快取 — 第一道防線。正確的 Cache-Control 標頭可防止重複請求。
  2. CDN 邊緣快取 — 分散式邊緣節點提供附近使用者快取內容。
  3. CDN 來源屏蔽 — 一種中間緩存,可整合來自邊緣節點的請求,從而顯著減少來源負載。
  4. 應用程式快取 — Redis 或 Memcached 位於資料庫結果和渲染片段的來源。
  5. 資料庫查詢快取 — 在資料庫層級快取頻繁的查詢結果。

起源之盾值得特別關注。當多個邊緣節點錯過同一資產的快取時,它們都會聯繫源頭——這是一個雷群問題。源屏蔽攔截這些請求,檢查自己的緩存,並且只聯繫來源一次。這可以減少 80-95% 的原始流量。透過 Cloudflare Argo 分層快取、Fastly Shield 或 CloudFront Origin Shield 對其進行配置。


監控與調試

為了確保您的快取策略有效,請監控以下指標:

  • 快取命中率 — 在 Cloudflare Analytics、Fastly Observatory 和 CloudFront 報告中提供。 80%以上為好; 95%以上為優秀。
  • CDN 回應標頭CF-Cache-Status (Cloudflare)、X-Cache (Fastly、CloudFront) 和 Age 告訴您是否從快取提供回應以及快取了多久。
  • 快取缺失分析 — 確定資產缺失的原因:首次請求、逐出、TTL 過期或明確繞過。

使用 curl 偵錯快取標頭:

curl -I https://example.com/assets/app.js -H "Accept-Encoding: gzip"
# Look for: CF-Cache-Status: HIT, Age: 12345

結論

有效的 CDN 快取結合了適當的 TTL、用於目標失效的代理鍵、用於零等待刷新的 stale-while-revalidate 以及具有恢復能力的原始屏蔽的多層快取。最有影響力的指令是 stale-while-revalidate — 它將性能與新鮮度的權衡從妥協轉變為兩者兼而有之的主張。將其與精心設計的代理鍵系統配對,投資 originshield,並監控緩存命中率以不斷提高。您的用戶將感謝您提供更快的載入時間,而您的來源伺服器將感謝您減少負載。