我們是 CMoney 消費事業群,目前旗下主力產品包括 發票載具、簡單記帳 以及 CWMoney 記帳 等服務。總會員數已超過 600 萬人,每月活躍用戶超過 150 萬。在每期開獎日,全產品線的同時在線人數突破 20 萬,我們在發票開獎與兌獎速度上,已領先業界其他競品。
然而,成為第一的路,並不輕鬆。在 2023 年以前,我們也曾深陷每次開獎系統就出錯的困境,甚至還曾經因為跑兌獎的邏輯太過密集,導致使用者的手機過熱、耗電異常,成為冬天的暖暖包。
從一團混亂到系統有餘裕:關鍵在於「修正錯誤」
一路走來,從「幾乎每次開獎都出錯」,到今天我們的系統可以支撐多樣化的開獎活動、增加中獎機會與安慰獎,並提供更加順暢的用戶體驗,背後的秘密其實沒有那麼玄——我們只是把每一個錯誤都認真修正了。
這個過程雖然單純,卻也充滿挑戰。接下來,我們不藏私地帶大家一起看看我們是怎麼從開獎地獄爬到今天的。
一、讓錯誤被「看見」:建立有效的記錄與通知機制
很多開發團隊都知道 Log(系統日誌)很重要,但也經常忽略它的價值。在我們的重構過程中,Log 是診斷問題、修復錯誤的第一步,對此我們做了以下努力:
- 我們開始 系統性地梳理每個模組、環節,為每個關鍵操作加入清楚、具備意義的 Log
- 建立一套即時通知機制,當錯誤發生時,第一時間能通知到對應的工程師
「錯誤若無法被偵測,就無法被解決。」這是我們轉變的第一步。
二、不放過任何錯誤:逐一修正才是王道
Log 有了,接下來就是執行力的考驗,我們堅持做到以下這幾件事:
- 每一筆錯誤,都被認真看待
- 每一條異常記錄,都會付出相對應的修正行動
- 絕不讓錯誤 Log 淹沒自己,也絕不關掉錯誤通知來「眼不見為淨」
這階段,我們讓服務「能活下來」了,雖然不再天天炸,但面對開獎日流量高峰,仍然力有未逮。
三、釐清「被大量呼叫的服務」:瓶頸才是重點
當使用者量與功能持續增加,我們意識到僅僅修正錯誤是不夠的,我們必須知道系統的瓶頸在哪裡。因此,我們開始:
- 全面記錄各服務的進出流量與效能
- 監控哪些 API 在開獎日會被大量呼叫
- 找出哪些呼叫會導致效能下降,甚至讓系統卡死
針對這些高風險服務,我們會進行評估與調整,例如:
- 是否可以增加 靜態快取
- 是否需調整 資料結構或索引
- 是否該改寫為 具備水平擴展能力的微服務架構
四、系統進化關鍵優化項目:一次次的開獎壓力測試
我們經過多次開獎日的「壓力煉成」,以下是我們實際執行的關鍵優化:
- 借助 Redis 的數位代碼比對功能 :加速大規模雲端發票的兌獎查詢效能
- 以用戶維度進行資料聚合 (Aggregate):有效濃縮資料量、減少計算成本
- 使用 MongoDB 分片集群架構:以用戶 ID 為 Sharding Key,進行高速且穩定的查詢
- 快取關鍵資料:於開獎日前預先將必要資料進行快取,減少實時資料庫負擔
透過這些優化,我們不再害怕開獎日,而是能自信迎戰每一次高峰。
這不是終點,而是另一段旅程的起點
雖然我們的系統已能承受數十萬人同時操作,但我們的目標不僅如此。接下來,我們的目標是讓系統需能承載更大規模的用戶量、所有關鍵服務在尖峰時刻都應維持毫秒等級的回應,此外我們還希望能提供更多能幫助用戶的創新功能與服務,以滿足更多元的需求。
Last but not least:歡迎與我們一起挑戰頂尖系統
如果你正苦於與天天罷工的系統抗爭,希望這篇文章能為你帶來一點啟發與方向。
而如果你對打造極致穩定、高效能系統有熱情,也歡迎加入我們,一起成為撐起千萬用戶服務的幕後英雄。
職缺現正熱映中-
【工程部】Senior .NET Engineer|消費事業:https://cmy.tw/00AQnU
了解更多 CMoney 職缺看這邊:https://cmy.tw/00AbzB
