從邊緣計算開始:用 CDN 邊緣節點讓應用離用戶更近實戰指南

如果你在做需要全國甚至全球用戶存取的 Web 應用,一定遇過這種痛:伺服器放在一個機房,遠端用戶每次請求都要「跨半個地球」跑一趟,延遲高、體驗差。這一期我們來聊邊緣計算(Edge Computing)——把運算搬到離用戶最近的 CDN 節點上執行。

先釐清一個容易混淆的點:上次我們聊過 Serverless(503 那篇),它解決的是「不用自己管伺服器」;而邊緣計算解決的是「程式碼到底在哪裡跑」。Cloudflare Workers、Vercel Edge Functions 這類平台,其實是兩者的交集——無伺服器 + 離用戶近。

一、CDN 快取 vs 邊緣計算

傳統 CDN 只能快取靜態資源(圖片、JS、CSS),本質是「影印機」;邊緣計算則把你的程式碼部署到全球數百個節點,能夠在邊緣動態執行邏輯:

  • A/B 測試分流:在邊緣根據 Cookie 決定回傳哪個版本,不用回源站。
  • API 閘道:在邊緣做鑑權、限流、請求改寫,攔下無效流量。
  • 個人化頁面:靜態外殼走 CDN 快取,動態片段由邊緣函式即時組裝。

二、步驟 1:寫第一個 Cloudflare Worker

export default {
  async fetch(request) {
    const url = new URL(request.url);
    // 在邊緣做請求標頭注入與改寫
    const headers = new Headers(request.headers);
    headers.set("x-edge-region", request.cf?.colo ?? "unknown");
    if (url.pathname.startsWith("/api/")) {
      // 回源到你的真正後端
      return fetch("https://backend.example.com" + url.pathname, {
        method: request.method,
        headers,
        body: request.body,
      });
    }
    return new Response("hello from edge: " + (request.cf?.colo ?? "?"), {
      headers: { "content-type": "text/plain" },
    });
  },
};

重點:邊緣函式的執行環境是精簡版 JS runtime(如 workerd),不是完整的 Node.js——大部分 Node 內建模組不可用,要用 Web 標準 API(fetch、Request、Response)。

三、步驟 2:用 KV 做邊緣快取

邊緣節點沒有傳統資料庫,通常配 KV(最終一致的鍵值儲存):

export default {
  async fetch(request, env) {
    const key = new URL(request.url).pathname;
    // 先讀邊緣 KV,命中直接回傳,延遲可壓到個位數毫秒
    const cached = await env.CACHE.get(key, "json");
    if (cached) return Response.json(cached);
    const fresh = await fetch("https://backend.example.com" + key).then(r => r.json());
    // 寫回 KV,設定 60 秒過期
    await env.CACHE.put(key, JSON.stringify(fresh), { expirationTtl: 60 });
    return Response.json(fresh);
  },
};

四、步驟 3:部署與本地開發

用官方 CLI wrangler 三步上線:

npm install -g wrangler
wrangler init my-edge-app   # 建立專案
wrangler deploy             # 部署到全球邊緣節點

本地用 wrangler dev 起模擬環境調試,不用每次都推上線。

五、特別注意:邊緣計算的三個邊界

  • 冷啟動與運算上限:單次執行有 CPU 時間限制(如 Workers 免費版 10ms),重運算請留在中心機房。
  • 資料一致性:KV 是最終一致,跨節點可能有秒級延遲,交易型業務不適合放邊緣。
  • 狀態在哪裡:邊緣是「無狀態」的,session、資料庫連線都要設計成外部化。

實踐心法:靜態內容全走 CDN、鑑權與分流放邊緣、重邏輯留中心——分層架構才是邊緣計算的正確打開方式,而不是把所有後端搬上去。

互動話題:你的專案裡,哪一個環節最適合先搬到邊緣?是 API 鑑權還是頁面分流?歡迎留言討論!