內容傳遞網路 (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)
- Cache Hit:Edge 已有內容 → 直接回傳,源站完全無感。這是 CDN 的價值所在,目標是把 hit ratio 拉到 90%+。
- Cache Miss:第一個請求(或 TTL 過期後)會「回源(origin fetch)」,抓回來順手快取,後續同區請求就變 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=12345、app.a1b2c3.js |
最推薦;改檔即改 URL,舊快取自然作廢,可放心設超長 TTL |
| Purge API(主動清除) | 呼叫 CDN API 主動清掉指定檔案/路徑的快取 | 即時生效;但全球傳播需時間,且大量 purge 會造成回源尖峰 |
| Stale-While-Revalidate(SWR) | 過期後仍先回舊快取,同時背景靜默回源更新 | 使用者永遠不等待;代價是短暫看到舊內容(最終一致) |
把 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、放什麼進去、快取怎麼失效,而不是比較廠商。
面試話術
而是「我對靜態資源(圖片、影片、JS/CSS)走 CDN,用 hash busting + 長 TTL 把 hit ratio 拉高;HTML 入口設短 TTL 確保拿到最新;API 因為有全球用戶,用 CDN 做就近 TLS + 路由加速,可快取的端點再加短 TTL;同時讓 CDN 當安全層吸收 DDoS、隱藏源站 IP。」展示你知道 CDN 是放在「該放的東西」前面,不是萬靈丹。
常見情境:
- Instagram 頭像/貼文圖片:上傳寫進 07-Caching-Storage/02-Blob-Storage(S3),URL 帶內容 hash,前面掛 CloudFront;全球用戶就近 hit,源站只服務第一次 miss。詳見 10-Design-Patterns/04-Handling-Large-Blobs。
- 前端部署:每次 build 產生帶 hash 的 JS/CSS,設
immutable永久快取,HTML 設 no-cache 當入口指向新資產 —— 部署零等待、無需 purge。 - 直播 / 大型活動:影片切片(HLS/DASH segments)走 CDN,幾百萬觀眾的流量由 Edge 扛,源站只推一份流。
常見 Deep Dive
分三種需求講:① 可預期的版本更新 → hash busting / 版本號改 URL,最乾淨,可搭配超長 immutable TTL;② 需要立即下架特定檔案(違規圖、洩漏資料)→ Purge API 主動清除;③ 可容忍短暫舊內容 → 短 TTL 或 Stale-While-Revalidate。千萬別用「把 TTL 設超短」來假裝即時,那會摧毀 hit ratio 並打爆源站。
純動態(每人不同)不能快取,但仍可加速:就近 TLS 終結省一個跨海握手、CDN 骨幹網路由比公網短、到源站的連線池重用。若內容是「半動態」(例如首頁、商品列表,所有人一樣但會變),可用短 TTL + SWR 或在 Edge Compute 做個人化拼裝。能快取的就快取,真不能快取的就只賺傳輸優化。
設計 fallback 到 Origin:DNS 層做健康檢查與故障切換(CDN 域名異常時把流量導回源站或備援 CDN)。前提是源站要有能直接服務的能力(別把所有可用性都押在 CDN)。進階做法是 multi-CDN(同時掛兩家 CDN,用 DNS / 流量管理器在它們之間切換或負載分配),避免單一 CDN 廠商成為單點故障。延伸閱讀 01-Networking/07-Fault-Handling。
兩種主流機制:① Anycast —— 同一個 IP 在全球多個 PoP 廣播,網路層 BGP 路由自然把封包送到最近的 PoP(Cloudflare 用法);② DNS-based —— 權威 DNS 依使用者解析來源(EDNS Client Subnet)回傳最近 Edge 的 IP(傳統 Akamai 用法)。本質都是「就近導流」,與 01-Networking/06-Load-Balancing 的全域負載平衡(GSLB)同源。
CDN 是最終一致:源站更新後,各 Edge 不會同步立刻更新,得等 TTL 過期、被 purge、或被 SWR 背景刷新。這對靜態資產完全可接受(用 hash busting 直接迴避)。絕對不要把 CDN 當成需要強一致的資料來源 —— 它前面快取的應該是「同一份內容對所有人都一樣、且可容忍短暫陳舊」的東西。對比 07-Caching-Storage/01-Caching 的失效策略。
這是面試最常見的扣分點。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 | 每人不同、不可快取的動態內容 |
Related Notes
- 07-Caching-Storage/01-Caching — CDN 是分散到全球的 read-through 快取;TTL / 失效策略同源
- 07-Caching-Storage/02-Blob-Storage — 最典型的 CDN 源站:S3 存圖片影片,CloudFront 在前面分發
- 10-Design-Patterns/04-Handling-Large-Blobs — 大型圖片/影片靠 CDN 就近分發是標準設計
- 01-Networking/06-Load-Balancing — CDN 就近導流(Anycast / GSLB)與全域負載平衡同源
- 01-Networking/03-HTTP-and-HTTPS — Cache-Control / TTL 由 HTTP header 控制;Edge 做 TLS 終結
- 01-Networking/07-Fault-Handling — CDN 掛掉的 fallback、multi-CDN、故障切換
- 11-Infrastructure/04-Serverless — Edge Compute 本質是跑在 CDN 節點上的 Serverless 函式
- 02-Distributed-Systems/05-Numbers-to-Know — 跨區 RTT 量級解釋了為何就近快取能大幅降延遲