大流量架構最常見的失敗,不是選錯技術,而是選錯順序。
我們在報價時常遇到這樣的客戶:聽說流量會成長,於是一口氣想導入 Kafka、Redis Cluster、資料庫分片、Kubernetes、全套 OpenTelemetry。預算花完了,系統卻比原本更難維運,流量真的來的時候反而更早倒下。
大流量設計的本質,是用最低的複雜度換最高的容量。哪一項技術先做、哪一項可以等,比「用什麼技術」更關鍵。
投資順序:先做槓桿最大的那一層
如果把高併發架構拆開,每一層帶來的效益並不對等。以下是我們的經驗法則,從報酬率高到低排:
第一順位是快取與 CDN。 靜態資源丟到 CDN、熱資料用 Redis 擋在資料庫前面,這兩件事的投入產出比幾乎沒有對手。一個讀多寫少的電商首頁,光是把商品列表快取個幾十秒,資料庫壓力就會差一個量級。CDN 更是只要 DNS 切過去、設好 cache header,幾乎沒有架構改動成本。
第二順位是服務無狀態化。 把 session、上傳暫存、使用者狀態從應用程式裡拔出來,丟到 Redis 或物件儲存。這件事不會直接讓系統變快,但它是後面所有水平擴展的前提。沒做這一步,加再多台機器都沒用,因為流量會卡在 sticky session 上。
第三順位才是訊息佇列。 當你開始有「寫入尖峰打爆資料庫」「第三方 API 拖慢主流程」這類問題,才需要 Kafka、RabbitMQ 或雲端的 SQS。佇列的價值是削峰填谷與解耦,不是「看起來比較專業」。如果你的寫入根本沒有尖峰,導入佇列只會多一個故障點。
第四順位是資料庫分片。 這是最後的手段,不是第一個答案。在分片之前,先確認你已經做完:讀寫分離、索引調優、慢查詢清理、冷熱資料分離。分片一旦做下去,跨片查詢、跨片交易、資料搬遷都會變成長期負債。
可觀測性是底層,不是加分項
上面四層不管你做到哪一步,可觀測性都要先到位。沒有 metrics、logs、traces,所謂的「優化」其實是猜。
最小可用組合其實不複雜:一套 metrics(Prometheus 或雲端對應服務)、結構化 log、再加上請求層級的 trace ID 串接。這三件事能讓你在出事時,幾分鐘內定位到是 DB 慢、是某個下游 API timeout、還是某台機器負載不平均。
常見的反模式是:先把架構鋪很大,可觀測性留到「之後再說」。結果系統一上線出事,工程師只能靠 SSH 進機器 tail log。這時候再補儀表板,往往要重新埋點、重新跑壓測,成本比一開始就做高得多。
舉個例子,假設一家中型電商準備雙十一檔期,與其急著導入分片與佇列,不如先確認:CDN 命中率有沒有量測、Redis 是否擋在熱門 API 前、應用伺服器能不能無痛擴一倍、儀表板上看不看得到 P95 延遲。這四件事做好,多數中型流量場景已經不會出事。
我們的觀察
大流量架構的難處,從來不是知道有哪些技術,而是知道「現在還不需要哪些技術」。每多引入一個元件,就多一份維運成本、一個潛在故障點、一條新的學習曲線。
與其追著架構圖上的最佳實踐跑,不如先量測自己現在的瓶頸在哪、最痛的是哪一層,再決定下一筆預算花在哪。技術選型可以等,量測能力不能等。
