12.4 從微服務到 FaaS:前端與業務平台實踐#
哪些該上 FaaS:三個判斷句#
不是所有微服務都值得變成函數。實戰判準只有三句:
- 流量抖得厲害(大促尖峰 vs 深夜閒置差 10 倍以上)→ 彈性值錢。
- 事件觸發(訂單建立、圖片上傳、定時結算)→ 不必常駐等請求。
- 無狀態且短時(秒級完成、狀態放外部)→ 縮零無負擔。
反之:高頻穩定流量、長連線、有狀態會話,留在 Deployment/StatefulSet 更划算。
flowchart TD
Q{流量穩定高頻?} -->|是| DEP[常駐 Deployment]
Q -->|否| Q2{事件觸發/短時無狀態?}
Q2 -->|是| FAAS[Knative / 函數計算]
Q2 -->|否| MOD[留在模組化單體]
FAAS --> EV[MQ 事件/Cron/API 網關觸發]實踐一:BFF 與前端 SSR 上 Serverless#
淘寶系前端(Node.js 技術棧,見 16.4 節)最早 Serverless 化的是 BFF 層:頁面聚合、SSR 渲染潮汐特徵明顯,大促前 1 小時流量漲 10 倍,閒時幾乎為零。
| 層 | 常駐 | FaaS 化後 |
|---|---|---|
| BFF 聚合(Node) | 常駐 50 Pod 扛尖峰 | 0→200 彈性,閒時縮零 |
| SSR 渲染 | 與 Web 同擴縮 | 獨立按頁面熱度擴縮 |
| 圖片裁剪/轉碼 | 佔用 Web 資源 | 事件觸發,非同步回填 |
# BFF 聚合函數:HTTP 觸發 + 併發目標調優(Node 單進程高併發)
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: bff-detail
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/target: "200" # Node 承載高併發
autoscaling.knative.dev/maxScale: "200"
spec:
containers:
- image: registry/shop/bff-detail:node20-v5
env:
- name: DOWNSTREAM_TIMEOUT_MS
value: "800"
實踐二:業務平台——事件驅動的標準接法#
訂單、優惠券、通知這類平台邏輯,標準接法是 MQ → Knative Eventing → 函數:
# 事件鏈:訂單建立 -> 觸發優惠券核銷 + 短信通知兩個函數
kn broker create order-broker -n prod
kn trigger create coupon-consume --broker order-broker \
--filter type=order.created --sink ksvc/coupon-consume -n prod
kn trigger create sms-notify --broker order-broker \
--filter type=order.created --sink ksvc/sms-notify -n prod
# 定時結算:Cron 觸發每日對賬函數
kn source cron create daily-settle --schedule "0 2 * * *" \
--data '{"job":"settle"}' --sink ksvc/settle-job -n prod
flowchart LR
ORD[訂單服務] -->|order.created| BR[Broker]
BR --> T1[Trigger 優惠券] --> F1[coupon-consume]
BR --> T2[Trigger 短信] --> F2[sms-notify]
CRON[CronSource 2:00] --> F3[settle-job]成本對比:什麼時候 FaaS 真省錢#
| 場景 | 常駐成本 | FaaS 成本 | 結論 |
|---|---|---|---|
| 穩定 70% 利用率 | 10 Pod 常駐 | 按次計費反而貴 20% | 留常駐 |
| 尖峰 10 倍、閒時 5% | 按尖峰備 100 Pod | 閒時近零 | FaaS 省 60%+ |
| 每天跑 1 次結算 | 1 Pod 空轉 23h | 每天跑 5 分鐘 | FaaS 省 90%+ |
教訓:FaaS 省的是「閒置」,不是「計算」。先看利用率曲線再搬。
本章小結#
- 上 FaaS 三判準:抖動大、事件觸發、無狀態短時;反之留常駐
- 前端 BFF/SSR 是最經典的 FaaS 場景(潮汐流量 + Node 高併發)
- 業務平台標準接法:MQ/Cron → Eventing Broker/Trigger → 函數
- 成本公式:FaaS 省閒置不省計算,先看利用率曲線
想一想#
- 為什麼 BFF 層比核心交易鏈路更適合先 FaaS 化?
- 你的「每天跑一次的結算任務」若用常駐 Pod,浪費比例是多少?算一算。
- 事件驅動(Broker+Trigger)相比同步 RPC 調函數,有什麼解耦好處與除錯代價?