自救必看三大準則

CQRS 是什麼 ?

 Brobridge 過去在指導客戶進行微服務架構設計時,總不免講到「命令與查詢責任分離(CQRS, Command Query Responsibility Segregation)」,這個詞因為對許多人來說很陌生,通常又被人簡化理解為「讀寫分離」。在微服務架構的領域中,CQRS 主要被用於解決資料庫效能問題、讓實現資料分散化的目標。當然,一涉及分散式架構,其中就帶來更多議題,如:如資料一致性、交易處理等。

什麼是 CQRS?

  • 查詢(Query):查看物件結果,而且不會改變物件的狀態、對物件本身沒有副作用

資料庫系統的 CQRS 實現

資料庫的讀寫分離

資料庫複寫 (Database Replication)

資料變更攔截 (CDC, Change Data Capture)

  • LinkedIn — Databus
  • Zendesk — Maxwell

應用程式的 CQRS 實現

服務層級的 CQRS

從 CDC 輸出事件以驅動分散式的資料處理

CDC 的做法原本是用於資料庫系統的資料同步,但我們可以將 CDC 的事件直接輸出給服務使用。當資料變更的狀態變成事件化,就不再只是資料庫系統內部的複寫機制,應用場景也會變得比較多元,不限於資料庫的同步,也包括應用層面的整合,實現事件驅動(Event-driven)的設計。甚至,整合微服務系統架構的設計時,可以採用「資料部分同步」的做法搭配服務拆分,實現分散式架構的彈性,甚至提升特定需求的存取效能。

事件驅動的分散式資料處理

運用事件驅動的資料流,達成資料同步與資料庫系統的 CDC 做法雷同,每當資料變更時,即進行資料的同步工作。但較為不一樣的是,事件是由「應用程式」所發動,不是由 CDC 機制所發動,而且事件本身與業務通常有直接相關性。換句話說,資料的同步是因為「領域事件」所觸發,而「不是因為資料變更而觸發同步」。

應用程式拋出領域事件跟其他服務同步資料
  1. 優化關聯式查詢的效能
  2. 在即時資料流架構下,同時實現資料的分類和處理

後記

CQRS 帶來的議題相當多,其中技術涉及到資料庫設計、訊息佇列,若更深入研究,則會和微服務拆分息息相關,有更多的內容可以討論。本文只是就一些簡單的場景,說明 CQRS 在實務上的一些應用方法。

留言

這個網誌中的熱門文章

短小精悍的.NET ORM神器 -- Dapper

遇見 Parameters 參數上限之大量資料寫入方法

Node.js 部署至 IIS 站台