架構(gòu)模式 CQRS

本文我們聊聊 CQRS 這種架構(gòu)模式。

CQRS 是用來解決什么問題的儡嘶?

我們先看一個場景宋雏。

系統(tǒng)中的數(shù)據(jù)模型是按照實體以及關(guān)系進行設(shè)計的是吧芜飘。

image

例如電商系統(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)就變成了這樣:

image

所以试溯,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ù)呢?

這是沒有限定的晕翠,你可以使用同步更新喷舀。

image

也可以異步更新砍濒,例如使用 MQ。

image

這種方式用的比較多硫麻,因為它的可靠性爸邢、擴展性都很好,只是會有短暫的數(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ù)自己的實際情況來抉擇窝爪。

推薦閱讀

OAuth2 圖解

輕松理解 Kubernetes 的核心概念

開發(fā)者必須要了解的架構(gòu)技術(shù)趨勢:Service Mesh

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市该园,隨后出現(xiàn)的幾起案子酸舍,更是在濱河造成了極大的恐慌,老刑警劉巖里初,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啃勉,死亡現(xiàn)場離奇詭異,居然都是意外死亡双妨,警方通過查閱死者的電腦和手機淮阐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁品,“玉大人泣特,你說我怎么就攤上這事√羲妫” “怎么了状您?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兜挨。 經(jīng)常有香客問我锌云,道長研铆,這世上最難降的妖魔是什么宪萄? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任谱净,我火速辦了婚禮,結(jié)果婚禮上噪舀,老公的妹妹穿的比我還像新娘魁淳。我一直安慰自己飘诗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布界逛。 她就那樣靜靜地躺著昆稿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仇奶。 梳的紋絲不亂的頭發(fā)上貌嫡,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音该溯,去河邊找鬼岛抄。 笑死,一個胖子當(dāng)著我的面吹牛狈茉,可吹牛的內(nèi)容都是我干的夫椭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼氯庆,長吁一口氣:“原來是場噩夢啊……” “哼蹭秋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堤撵,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仁讨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后实昨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞豁,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年荒给,在試婚紗的時候發(fā)現(xiàn)自己被綠了丈挟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡志电,死狀恐怖曙咽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挑辆,我是刑警寧澤例朱,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站鱼蝉,受9級特大地震影響茉继,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚀乔,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菲茬。 院中可真熱鬧吉挣,春花似錦派撕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氯哮,卻和暖如春际跪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喉钢。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工姆打, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肠虽。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓幔戏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親税课。 傳聞我的和親對象是個殘疾皇子闲延,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容