AWS Lambda vs Cloudflare Workers:Serverless 平台深度比較
AWS Lambda vs Cloudflare Workers:Serverless 平台深度比較
Serverless 計算已經成為現代後端架構的重要選項。AWS Lambda 是老牌的無伺服器運算服務,Cloudflare Workers 則是新興的邊緣運算平台。這兩個服務各有優缺點,適合不同的使用情境。
架構差異
AWS Lambda
- 運行在 AWS 的區域資料中心(Region)
- 支援多種語言:Node.js、Python、Go、Java、Ruby、.NET
- 每次呼叫可能有冷啟動延遲(Cold Start)
- 執行時間上限:15 分鐘
- 記憶體:128MB - 10GB
Cloudflare Workers
- 運行在全球 300+ 個邊緣節點(PoP)
- 基於 V8 引擎,支援 JavaScript/TypeScript 和 WASM
- 幾乎無冷啟動(使用 Isolate 模型而非容器)
- 執行時間上限:30 秒(免費)/ 15 分鐘(付費)
- 記憶體:128MB
冷啟動比較
這是兩者最大的差異。Lambda 使用容器模型,首次呼叫需要初始化容器:
AWS Lambda 冷啟動時間(典型):
- Node.js:100-500ms
- Python:100-400ms
- Java:500-2000ms(最嚴重)
- 使用 SnapStart 可大幅改善 Java 的冷啟動
Cloudflare Workers 冷啟動:
- 通常 < 5ms(V8 Isolate 啟動極快)程式碼範例比較
AWS Lambda(Node.js)
exports.handler = async (event, context) => {
const { httpMethod, path, body } = event;
if (httpMethod === 'GET' && path === '/users') {
const users = await getUsersFromDB();
return {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
body: JSON.stringify(users)
};
}
return {
statusCode: 404,
body: JSON.stringify({ error: 'Not Found' })
};
};Cloudflare Workers
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (request.method === 'GET' && url.pathname === '/users') {
const users = await getUsersFromDB(env);
return new Response(JSON.stringify(users), {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
});
}
return new Response(JSON.stringify({ error: 'Not Found' }), {
status: 404
});
}
};Workers 的 API 更接近 Web 標準(Request/Response),而 Lambda 有自己的事件格式。
資料儲存整合
Lambda 的儲存選項
- DynamoDB:NoSQL,原生整合,延遲低
- RDS:關聯式資料庫,需要注意連線池
- ElastiCache:Redis 快取
- S3:物件儲存
// Lambda + DynamoDB
const { DynamoDBClient, GetItemCommand } = require("@aws-sdk/client-dynamodb");
const client = new DynamoDBClient({ region: "ap-northeast-1" });
exports.handler = async (event) => {
const result = await client.send(new GetItemCommand({
TableName: "Users",
Key: { userId: { S: event.userId } }
}));
return result.Item;
};Workers 的儲存選項
- KV:全球分散式 key-value 儲存
- D1:SQLite 資料庫
- R2:物件儲存(S3 相容)
- Durable Objects:有狀態的邊緣運算
// Workers + KV
export default {
async fetch(request, env) {
const userId = new URL(request.url).searchParams.get('id');
// 從 KV 讀取(全球複製,極低延遲)
const user = await env.USERS_KV.get(userId, { type: 'json' });
if (!user) {
return new Response('Not found', { status: 404 });
}
return Response.json(user);
}
};費用比較
| 項目 | AWS Lambda | Cloudflare Workers |
|---|---|---|
| 免費額度 | 100萬次/月 | 100,000次/天 |
| 超過費用 | $0.20/100萬次 | $0.30/百萬次 |
| 計算費用 | 依GB·秒計費 | 已包含 |
| 網路傳輸 | 額外收費 | 免費 |
對於流量不大的專案,兩者都有慷慨的免費額度。
本地開發體驗
Lambda:
# AWS SAM
sam local invoke -e event.json
sam local start-apiWorkers:
# Wrangler(Workers 的 CLI)
npx wrangler dev
# 本地直接在瀏覽器測試,體驗非常好Workers 的本地開發體驗明顯更流暢,wrangler dev 啟動極快,而且支援 hot reload。
使用情境建議
選 Lambda 的情境:
- 需要長時間執行的任務(> 30 秒)
- 需要大量記憶體(> 128MB)
- 已深度整合 AWS 生態系(RDS、SQS 等)
- 使用 Java、Go 等非 JS 語言
- 需要 VPC 內的私有資源存取
選 Cloudflare Workers 的情境:
- 追求極低延遲(< 50ms 全球)
- API 閘道、認證、A/B 測試等邊緣邏輯
- 靜態資源處理、重定向
- 不想管理 IAM 角色和複雜的 AWS 設定
- 成本優先,免費額度更大
我自己的專案目前兩者都在用:需要複雜業務邏輯或整合 RDS 的用 Lambda,對延遲敏感的 API 或邊緣快取用 Workers。
分享這篇文章