如果你在做需要全國甚至全球用戶存取的 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 鑑權還是頁面分流?歡迎留言討論!