微服務架構演進

單體資料庫拆分至微服務領域邊界時的資料一致性與 Saga 模式設計

作者:陳冠宇 (資深資料架構顧問) 發布日期:2025-12-10 預估閱讀時間:15 分鐘
單體資料庫拆分至微服務領域邊界時的資料一致性與 Saga 模式設計
核心摘要:

將龐大的單體資料庫依據領域驅動設計 (DDD) 拆分至各自微服務時,跨表 JOIN 失效與跨服務交易該如何處理?本文梳理資料邊界劃分、CQRS 與 Saga 補償機制的落地步驟。

單體資料庫拆分的痛點:失去 ACID 庇護

在單體架構中,開發者習慣了利用單一資料庫的交易機制(BEGIN ... COMMIT)與跨表 JOIN 語句來快速實現複雜業務。然而當團隊規模擴大、不同模組由不同團隊獨立維護時,共用單體資料庫會成為協同開發與系統部署的巨大瓶頸。當我們將資料庫拆分,讓每個微服務擁有自己獨立的資料儲存時,首當其衝的挑戰就是跨庫交易無法再依賴傳統的本機事務。

領域邊界劃分的實務準則

拆分資料庫的第一步不是切分表格,而是梳理業務聚合根(Aggregate Root)。必須確保一個事務內強一致性變更的所有資料留在同一個服務內部;而跨服務之間的協同,則透過領域事件(Domain Events)以最終一致性的方式傳遞。 在架構設計中,我們推崇採用 Transactional Outbox 模式:微服務在寫入業務資料庫的同時,將對應的事件記錄在同庫的 outbox 表中,藉由本機交易保證事件不遺失,再由獨立程序可靠地發布至訊息匯流排(Message Broker)。

Saga 模式的編排與補償交易設計

當涉及多個微服務的長鏈路業務(如建立訂單 -> 扣減庫存 -> 扣減點數 -> 發起扣款)時,我們建議採用基於編排器(Orchestration-based Saga)的方式。編排器負責依序呼叫各微服務,若其中某一步驟失敗(如扣款餘額不足),編排器將依序觸發先前成功步驟的反向補償交易(如回補庫存、取消訂單),確保分散式系統全體狀態回歸乾淨的一致性收斂。

關於作者與架構諮詢

陳冠宇 (資深資料架構顧問) 為 Data Prismhub Advisory(稜鏡數據顧問)資深架構師,常年主導跨國金融與電商系統之高併發資料庫調優與微服務拆分。