電商平台架構
以公開商品圖片、私人訂單 API 與 PostgreSQL 交易為例,拆分可快取內容和使用者資料。Cloud Run 的擴縮仍受資料庫連線、應用設計與預算限制,不能由每日訂單量直接保證效能。
使用者:先由 DNS 取得 LB 位址
│ HTTPS
▼
global external Application LB
URL map 依路徑分流
┌────────┴────────┐
▼ ▼
/assets/* /api/*
Cloud CDN API 不啟用 CDN
backend bucket serverless NEG
│ │
▼ ▼
Storage 公開商品素材 Cloud Run API
(私有 origin 亦可) (逐次驗證與授權)
│ VPC 路徑
▼
Cloud SQL 私人 IP
(連線池與交易)
私人上傳 → 獨立 bucket+存取授權
(不放入公開素材或共用快取路徑) 超出寬度時可左右捲動;鍵盤可聚焦文字圖後按左右方向鍵。
使用服務
設計決策(為什麼這樣選?)
本例以 Cloud Run 執行容器化 API;先量測延遲、並行請求、啟動與下游容量,再設定擴縮。縮至零不代表 SQL、負載平衡器、網路或儲存一起零費用。
Cloud SQL 用於本例的 PostgreSQL 交易與既有生態;是否改用 Spanner 取決於交易分布、擴展、延遲與營運需求,不由「電商」或日訂單數直接決定。
將公開素材路徑導向啟用 CDN 的 backend bucket,API 導向另一個 serverless NEG backend,本例不對 API 啟用 CDN。帳戶、購物車與訂單回應設定 no-store,逐次驗證身分與物件權限。
不要把 FORCE_CACHE_ALL 套到私人內容;它可能忽略 private/no-store。若未來對 Cloud Run 的公開回應啟用 CDN,須另查快取模式、標頭、cache key 與簽名 URL 的行為。
Private IP 需要 Cloud Run 到 VPC 的實際網路路徑。本例採 Direct VPC egress 或相容的 Serverless VPC Access,再依官方路徑使用 private IP/TCP 與所需 TLS;Auth Proxy 不會替應用建立 VPC 路由。
以實例數乘上每實例連線池大小作連線預算起點,另留發布、重試、其他服務與管理連線餘裕。maximum instances 可能短暫超出設定,不能當成資料庫總連線的硬保證。
商品圖片與私人上傳採分開的 bucket/權限與 URL 路徑;物件儲存與 BLOB 的成本依大小、讀寫、快取和網路估算,不宣稱固定便宜十倍。CORS 控制瀏覽器跨來源行為,不是使用者授權。
實作步驟(9 步)
- 先定義公開素材、私人檔案、帳戶與訂單的路徑、授權規則、延遲目標、尖峰負載及完整費用假設
- 建立 Cloud SQL PostgreSQL,規劃私人 IP 網路、資料庫身分、所需 SSL/TLS、備份與還原;依可用性需求選配置
- 設定 Cloud Run 到 SQL 所在 VPC 的 Direct VPC egress 或相容 connector,驗證 private IP/TCP 可達及 TLS 伺服器驗證;Proxy 與 IAM 不能取代路由
- 部署 Cloud Run API,設定最小服務身分、秘密存取、連線池、逾時與擴縮;記錄資料庫可用連線預算及保留餘裕
- 建立公開素材與私人上傳的獨立 bucket;若選 private bucket access 作素材 origin,依官方文件設定回源身分,不因此省略私人檔案的使用者授權
- 建立 global external Application Load Balancer,以 URL map 將素材導向 CDN backend bucket、API 導向同區域 Cloud Run 的 serverless NEG;API backend 不啟用 CDN
- 設定 HTTPS 憑證及 Cloud Run ingress,依需求限制外部直接連到 run.app;內部來源、IAM 與應用授權仍分開驗證
- 以兩個測試帳號驗證購物車、訂單與下載不會共用快取或跨帳號,檢查 CDN/瀏覽器/應用快取及 no-store;不得對私人內容使用 FORCE_CACHE_ALL
- 以尖峰、重試、發布及 SQL 中斷情境檢查連線池、退避與應用恢復;量測延遲、錯誤率、資料庫連線及費用,再調整容量
電商的快取、連線與檔案檢核
用下列情境檢查讀寫路徑與失敗情況。數字只是容量規劃練習,並非效能或費用保證。
展開 3 個設計情境
01 · CDN 會不會把 A 的購物車交給 B?
工程師把 /api/cart 與公開圖片放在同一個啟用 FORCE_CACHE_ALL 的 backend,認為 API 回應有 no-store 就不會被快取。
參考判斷與驗證證據
本例把 API 與公開素材分到不同 backend,API 不啟用 CDN。私人回應的 no-store 仍需保留,但不能拿它抵銷 FORCE_CACHE_ALL 或簽名 URL 的特殊快取行為;應用每次仍須授權。
應提出的驗證證據
以 A/B 與未登入狀態重複讀取同一路徑,檢查本文、快取標頭、CDN 日誌及瀏覽器快取;確認 A 的訂單/購物車從未成為 B 的共用回應。
02 · 100 個實例,每個 pool 10 條連線?
Cloud SQL 分配給應用的連線預算是 300,Cloud Run 規劃 100 個實例,每個連線池上限 10。部署 Proxy 就能解決嗎?
參考判斷與驗證證據
100 × 10 已是 1,000 條潛在連線的規劃值,超過這個練習的 300 預算。Proxy 不會擴大資料庫容量,也不會建立 private IP 路由。協調 pool、並行數與擴縮,保留發布和其他工作負載餘裕。
應提出的驗證證據
在測試環境分開驗證 VPC 可達、TLS/身分與連線池飽和;以發布、重試和尖峰量測實際連線。maximum instances 可能短暫超出,不能只靠乘法或單一上限宣稱絕不超載。
03 · 設了 CORS,私人檔案就安全?
收據與商品圖片混在同一個可公開讀取的 bucket。團隊把 CORS 的來源限制成官網,打算以此保護收據。
參考判斷與驗證證據
CORS 不會授權下載者,也不會阻止非瀏覽器直接請求。將私人上傳與公開素材分開,先驗證使用者與物件權限,再提供受控下載;不要讓私人檔案進入公開 URL 或共用快取路徑。
應提出的驗證證據
測試未登入、另一個帳號與直接物件 URL 的讀取,確認不能取得收據;也測試快取、已發行下載連結的有效範圍與到期行為。
查核日期:
本範例的素材/API 分流、私人回應快取、Cloud SQL 連線路徑、連線預算與檔案授權。情境為依來源推導的練習,未實測雲端效能或帳單。
- Cloud CDN 快取公開且可共用的內容;帳戶、購物車與訂單需要獨立的授權與快取規則
- Private IP、VPC 可達、連線加密、IAM 與資料庫身分是不同層;Auth Proxy 不會自動打通 VPC
- Cloud Run 擴縮不會擴大 Cloud SQL 的連線預算,需協調 pool、並行數、實例上限與發布餘裕
- CORS 不是檔案授權;公開商品素材與私人上傳要分開設計
- 效能與費用都要有負載假設,不用「無伺服器」推導無限制擴展或整個方案免費