本文我們聊聊 CQRS 這種架構(gòu)模式。
CQRS 是用來解決什么問題的儡嘶?
我們先看一個場景宋雏。
系統(tǒng)中的數(shù)據(jù)模型是按照實體以及關(guān)系進行設(shè)計的是吧芜飘。
例如電商系統(tǒng),包含訂單磨总、用戶嗦明、商品等等數(shù)據(jù)。
數(shù)據(jù)的變更操作蚪燕、查詢操作娶牌,都是基于這一套數(shù)據(jù)模型的。
但是馆纳,實際場景下的查詢需求是多種多樣诗良。
例如這3類人群:
商家
買家用戶
電商運營人員
他們的數(shù)據(jù)視角是不同的,各自的關(guān)注角度不同鲁驶,需要查詢的數(shù)據(jù)就完全不同鉴裹。
但數(shù)據(jù)模型是一套啊,怎么辦?
是不是就需要做數(shù)據(jù)關(guān)聯(lián)径荔、構(gòu)建臨時數(shù)據(jù)集合等等復(fù)雜的操作啊督禽。
基于一種數(shù)據(jù)模型,來實現(xiàn) N 種視角的查詢总处,既別扭又麻煩狈惫。
CQRS 是怎么解決的呢?
CQRS 的全稱是:
Command Query Responsibility Segregation
意思是 命令查詢職責(zé)隔離鹦马。
命令是指 插入虱岂、修改、刪除菠红,就是更改數(shù)據(jù)的動作第岖。
隔離之后,結(jié)構(gòu)就變成了這樣:
所以试溯,CQRS 會有兩個數(shù)據(jù)模型蔑滓,一個命令模型,一個查詢模型(可以有多個)遇绞。
命令模型的數(shù)據(jù)變更后键袱,需要同步給查詢模型。
這樣做的核心目的就是:
讓數(shù)據(jù)查詢可以放飛自我摹闽。
各種復(fù)雜的查詢操作再也不用基于單一死板的存儲結(jié)構(gòu)了蹄咖。
命令模型數(shù)據(jù)同步過來之后,查詢模型可以根據(jù)自己的想法來重新組織數(shù)據(jù)結(jié)構(gòu)付鹿,從而實現(xiàn)想怎么查就怎么查澜汤,簡單高效。
這樣就解決了以前單一數(shù)據(jù)模型帶來的查詢尷尬場面舵匾。
這看起來不就是變成2個微服務(wù)嗎俊抵?
并不是的,微服務(wù)的劃分是基于業(yè)務(wù)領(lǐng)域的坐梯,不同的領(lǐng)域才劃分為不同的微服務(wù)徽诲。
但 CQRS 中的命令模型、查詢模型吵血,它們還是屬于同一領(lǐng)域的谎替,查詢模型不能脫離命令模型,它們是緊耦合的蹋辅。
所以 CQRS 并不是兩個獨立的微服務(wù)钱贯。
那么 CQRS 如何同步數(shù)據(jù)呢?
這是沒有限定的晕翠,你可以使用同步更新喷舀。
也可以異步更新砍濒,例如使用 MQ。
這種方式用的比較多硫麻,因為它的可靠性爸邢、擴展性都很好,只是會有短暫的數(shù)據(jù)不一致拿愧。
CQRS 看起來很像緩存案芎印?
是有些類似浇辜,但查詢模型并不是單純的用來提升查詢性能的數(shù)據(jù)鏡像券敌。
查詢模型的本質(zhì)是用于創(chuàng)建多樣化的數(shù)據(jù)展現(xiàn)形式。每一種形式適用于某類用戶的需求柳洋。
CQRS 的查詢模型可以使用不同的技術(shù)實現(xiàn)待诅,例如有些使用關(guān)系數(shù)據(jù)庫,有些使用 Redis ……
CQRS 把數(shù)據(jù)變更熊镣、查詢分離之后卑雁,為查詢帶來了最大化的自由,同時呢绪囱,也大幅提升了這兩方面的工作效率测蹲,相較于之前整合在一起,分開后負(fù)載壓力肯定會減輕鬼吵。這也是 CQRS 帶來的性能優(yōu)勢扣甲。
CQRS 有什么不足?
凡事都有兩面性齿椅,很明顯琉挖,CQRS帶來了復(fù)雜性。
之前一體的時候媒咳,只有一個數(shù)據(jù)模型粹排,一套技術(shù)。
使用 CQRS 之后涩澡,至少就要有 2 個模型,使用的技術(shù)也會增加坠敷。
還要保持?jǐn)?shù)據(jù)的同步妙同,開發(fā)維護的任務(wù)自然更重了。
還有數(shù)據(jù)一致性的問題膝迎,如果使用同步方式粥帚,一致性強,但跨數(shù)據(jù)源的實時同步可不容易限次,寫入性能必然下降芒涡,失敗的概率也會增加柴灯。
如果使用異步方式,那就要考慮數(shù)據(jù)延遲問題费尽,在需要立即看到變化結(jié)果的場景就不能使用了赠群。
小結(jié)一下,CQRS 把數(shù)據(jù)的變更和查詢拆開了旱幼,有各自的數(shù)據(jù)模型查描。
命令模型負(fù)責(zé)數(shù)據(jù)的變更,并把最新數(shù)據(jù)同步給命令模型柏卤。
命令模型根據(jù)自己的想法來安排數(shù)據(jù)冬三,想怎么用就怎么用。
好處是可以讓查詢更加自由缘缚,更快的滿足多變的業(yè)務(wù)需求勾笆。
壞處是增加了架構(gòu)的復(fù)雜度,還有數(shù)據(jù)同步帶來的問題桥滨。
我們可以根據(jù)自己的實際情況來抉擇窝爪。
推薦閱讀