Brobridge 過去在指導客戶進行微服務架構設計時,總不免講到「命令與查詢責任分離(CQRS, Command Query Responsibility Segregation)」,這個詞因為對許多人來說很陌生,通常又被人簡化理解為「讀寫分離」。在微服務架構的領域中,CQRS 主要被用於解決資料庫效能問題、讓實現資料分散化的目標。當然,一涉及分散式架構,其中就帶來更多議題,如:如資料一致性、交易處理等。 由於 CQRS 的概念在分散式系統,以及現今的微服務架構下被廣泛應用,小從資料儲存,大到整個服務應用系統層面都可以看到其存在,而且使用方法和層面非常多元且複雜,往往我們很難單從一些表面上的名詞和概念就能完全理解 CQRS 所帶來的好處,和對於微服務架構的重要性。 有鑑於此, 本文將分成「資料庫系統」以及「應用程式」兩個角度,來討論 CQRS 模式在實務上的應用方法 ,也試著利用簡單的方式說明實務面我們如何採用這樣的設計模式。 什麼是 CQRS? 這個概念來自於物件導向的「命令與查詢分離(CQS, Command Query Separation)」,出自於 1987 年 Betrand Meyer 的 Object-Oriented Software Construction(物件導向軟體建構)一書,其原始概念是我們可以把物件操作分為命令(Command)和查詢(Query)兩種形式。 而這兩種操作的行為分別為: 命令(Command):執行後 會改變物件狀態 。 查詢(Query):查看物件結果,而且 不會改變物件的狀態、對物件本身沒有副作用 。 類似的概念,我們可以應用在分散式架構或微服務架構之下,只是我們不討論物件的行為,取而代之的是服務的行為,在實務上,此概念主要是用來解決資料操作的效率、服務責任的劃分,以及分散式系統下利用「重複性」來提升系統整體效能的問題。 如果你閱讀過我們的另一篇文章:「 淺談微服務拆分原理 」,裡面對於服務進行業務拆分的部分,圖上 Action 所表示的「 Commands/Query 」指的就是 CQRS 當中的命令和查詢。 資料庫系統的 CQRS 實現 以往在討論服務系統設計時,因為資料庫總是會遭遇到效能瓶頸,就會嘗試使用「讀寫分離」來解決問題,所以這樣的做法早就被大量使用。資料儲存層面的 CQRS,一直都是