內容傳遞網路 (CDN)

一句話定位

CDN 是一張地理分散的快取網路:把內容複製到全球各地、離使用者最近的 Edge 節點,讓請求就近命中而不必跨海打到源站。
本質是用空間換時間 —— 把「使用者 ↔ 源站」的長距離往返,換成「使用者 ↔ 鄰近 Edge」的短距離往返,同時把絕大多數流量擋在源站之外。面試重點不是「會不會用」,而是只放在該放的東西前面(靜態資源、高頻內容),而不是無腦把所有流量都塞進 CDN。

為什麼需要 CDN

現代服務面向全球使用者,但你的源站只在少數幾個 region。台灣使用者打到 us-east-1 的源站,一個來回(RTT)就要 200ms+,再加上 TCP 三次握手與 TLS 握手,光建立連線就吃掉 500ms~1s。使用者(以及面試官)對載入時間沒耐心,延遲直接轉化成跳出率與營收損失。

CDN 解決兩件事:

痛點 CDN 怎麼解
延遲(距離) 內容快取在離使用者最近的 Edge,RTT 從跨國降到同城等級
源站負載 命中 Edge 的請求永遠不會碰到源站,源站只服務 cache miss
頻寬成本 Edge 吐出的流量由 CDN 承擔,源站對外頻寬大幅下降
可用性 / 安全 DDoS 流量被 Edge 吸收,源站 IP 可隱藏在 CDN 後面

詳見 02-Distributed-Systems/05-Numbers-to-Know 對 RTT 與跨區延遲的量級。


運作流程:Cache Hit vs Cache Miss

CDN 是一層讀取快取(read-through cache),行為與 07-Caching-Storage/01-Caching 的 cache-aside / read-through 模式同源,只是分散在全球。

使用者請求 example.com/avatar.jpg
        │
        ▼
   DNS / Anycast 把請求導向「最近」的 Edge 節點 (PoP)
        │
        ▼
   ┌────────────────────────┐
   │  Edge 節點有快取嗎?     │
   └────────────────────────┘
        │                  │
     HIT(命中)        MISS(未命中)
        │                  │
        │                  ▼
        │         向 Origin 抓取 → 存進 Edge 快取(依 TTL)
        │                  │
        ▼                  ▼
   直接回傳給使用者     回傳給使用者(之後同區請求都變 HIT)
第一個使用者「暖快取」

每個 Edge 的快取是獨立的。亞洲第一個請求 avatar.jpg 的人會吃到 miss(要回源),但他幫整個亞洲區把快取暖好了,後面的人都是 hit。這就是為什麼 CDN 對高頻、多人共享的內容(頭像、熱門影片、JS bundle)效益最大。


架構特徵與術語

術語 說明
Edge Node(邊緣節點) 最靠近使用者的伺服器,負責回應快取內容;是使用者實際打到的點
PoP(Point of Presence) 一個地理據點(通常一個城市/IX),內含一群 Edge 節點;全球散布數十~數百個
Origin Server(源站) 內容的權威來源(你的應用伺服器或 07-Caching-Storage/02-Blob-Storage
Cache Hierarchy 多層快取:Edge Cache → Regional / Shield Cache → Origin
協定支援 HTTP/HTTPS 為主,部分 CDN 支援 WebSocket、gRPC、API 加速

多層快取(Cache Hierarchy)為什麼重要

如果幾百個 Edge 同時 miss,全部直接打源站 → 源站照樣被打爆(這叫 thundering herd / cache stampede)。中間加一層 Regional Cache(也叫 Origin Shield) 收斂回源請求:

數百個 Edge ──┐
             ├─► Regional / Shield Cache ──► Origin(只看到極少量回源)
數百個 Edge ──┘

效果:原本 N 個 Edge × M 次 miss 的回源流量
     被 Shield 收斂成「每個物件回源一次」

這把源站要承受的回源 QPS 從「Edge 數量級」降到「物件數量級」,是大型 CDN 的標配。


常見功能(不只是快取)

功能 內容
內容快取 對 CSS / JS / 圖片 / 影片等靜態檔做快取(核心功能)
動態內容加速 TCP 優化、就近 TLS 終結、優化路由(CDN 骨幹網比公網更快)縮短回源延遲
安全防護 DDoS 吸收、WAF(Web Application Firewall)、Bot 防護、隱藏源站 IP
壓縮與優化 Gzip / Brotli 壓縮、圖片壓縮、自動轉 WebP/AVIF、自適應位元率(影片)
Edge Compute(邊緣運算) 在 Edge 節點跑程式邏輯(Cloudflare Workers、Akamai EdgeWorkers、Lambda@Edge)
動態內容也能「加速」,但不是「快取」

純動態回應(每人不同的 API 結果)不能快取,但 CDN 仍能加速:① 就近 TLS 終結(在 Edge 完成握手,不必跨海握手)② CDN 私有骨幹網比公網路由更短更穩 ③ 連線重用(Edge 到源站維持長連線池)。這是「Dynamic Content Acceleration」的本質 —— 優化的是傳輸路徑,不是快取命中。

Edge Compute 與 11-Infrastructure/04-Serverless 的關係

Edge Compute 本質是「跑在 CDN 節點上的 Serverless 函式」,特性與限制更嚴格(更短的執行時間、更小的記憶體、無法存取完整 OS)。常見用途:A/B 測試分流、改寫 header、JWT 驗證、個人化重導、地理路由 —— 把這些輕量邏輯下放到離使用者最近的地方,省掉一個跨海往返。


Cache Invalidation:CDN 最難的部分

電腦科學兩大難題:命名、快取失效(cache invalidation)、以及差一錯誤。CDN 把第二個難題放大到全球規模 —— 你更新了源站的圖片,但全球幾百個 Edge 還快取著舊版。

策略 做法 取捨
TTL(Time-to-Live) 設過期時間,過期才回源驗證;圖片設一週、CSS 設一天 簡單;但 TTL 內的更新看不到,TTL 太短又失去快取效益
版本號 / Hash Busting URL 帶版本或內容 hash:app.css?v=12345app.a1b2c3.js 最推薦;改檔即改 URL,舊快取自然作廢,可放心設超長 TTL
Purge API(主動清除) 呼叫 CDN API 主動清掉指定檔案/路徑的快取 即時生效;但全球傳播需時間,且大量 purge 會造成回源尖峰
Stale-While-Revalidate(SWR) 過期後仍先回舊快取,同時背景靜默回源更新 使用者永遠不等待;代價是短暫看到舊內容(最終一致)
別用短 TTL 來「確保即時更新」

把 TTL 設成幾秒換取「即時」是反模式:hit ratio 崩潰、回源流量暴增、源站被打。正解是 immutable + hash busting —— 內容不變的檔案設超長 TTL(Cache-Control: max-age=31536000, immutable),要更新就換檔名/版本號。需要立即下架特定檔案(例如違規圖片)才用 Purge API。

推薦組合:
  HTML(入口、會變)        → 短 TTL 或 no-cache,總是拿到最新
  JS / CSS(hash 在檔名)   → max-age=1年, immutable(永不失效,靠改名更新)
  圖片 / 影片(靜態資產)   → 長 TTL + 需要時用 Purge API

適用場景

場景 說明
靜態資源分發 圖片、影片、JS/CSS、字型、HTML(核心場景)
API 加速 全球用戶的 API,用就近 TLS + 骨幹路由降延遲,可快取的端點還能快取
大型活動流量峰 遊戲發佈、線上演唱會、體育直播 —— 突發流量由 Edge 吸收
安全防護層 把 DDoS / 惡意流量擋在 Edge,不讓它打到源站

常見產品

類別 產品
商業 CDN Cloudflare、Akamai、Fastly
雲端商 CDN AWS CloudFront、Azure CDN、Google Cloud CDN

面試報名稱即可,重點是說清楚為什麼用 CDN、放什麼進去、快取怎麼失效,而不是比較廠商。


面試話術

最有說服力的回答不是「前面加個 CDN」

而是「我對靜態資源(圖片、影片、JS/CSS)走 CDN,用 hash busting + 長 TTL 把 hit ratio 拉高;HTML 入口設短 TTL 確保拿到最新;API 因為有全球用戶,用 CDN 做就近 TLS + 路由加速,可快取的端點再加短 TTL;同時讓 CDN 當安全層吸收 DDoS、隱藏源站 IP。」展示你知道 CDN 是放在「該放的東西」前面,不是萬靈丹。

常見情境:


常見 Deep Dive

不要在所有流量前面都畫一個 CDN

這是面試最常見的扣分點。CDN 適合靜態資源與高頻共享內容。對每人不同、不可快取的動態回應(個人化 feed、購物車、即時餘額),盲目擺 CDN 既不能命中又徒增一跳。正確做法是「靜態走 CDN、動態走加速(或不走)、API 視可快取性決定」。


自我測驗重點

問題 重點
Cache Hit vs Miss Hit 直接回、Miss 回源並暖快取;目標 hit ratio 90%+
Edge / PoP / Origin / Shield Edge 服務使用者、PoP 是據點、Shield 收斂回源、Origin 是權威來源
四種快取失效 TTL / Hash Busting(首選)/ Purge API / Stale-While-Revalidate
為何別用短 TTL 求即時 摧毀 hit ratio、回源暴增;正解是 immutable + hash busting
動態內容怎麼加速 就近 TLS、骨幹路由、連線重用;Edge Compute 拼個人化
CDN 掛掉 fallback 到 Origin、multi-CDN、DNS 故障切換
就近導流機制 Anycast(BGP)或 DNS-based(GSLB)
什麼不該放 CDN 每人不同、不可快取的動態內容