架構模式 CQRS

本文我們聊聊 CQRS 這種架構模式。

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

我們先看一個場景。

系統中的數據模型是按照實體以及關系進行設計的是吧。

image

例如電商系統,包含訂單、用戶、商品等等數據。

數據的變更操作、查詢操作,都是基于這一套數據模型的。

但是,實際場景下的查詢需求是多種多樣。

例如這3類人群:

  • 商家

  • 買家用戶

  • 電商運營人員

他們的數據視角是不同的,各自的關注角度不同,需要查詢的數據就完全不同。

但數據模型是一套啊,怎么辦?

是不是就需要做數據關聯、構建臨時數據集合等等復雜的操作啊。

基于一種數據模型,來實現 N 種視角的查詢,既別扭又麻煩。

CQRS 是怎么解決的呢?

CQRS 的全稱是:

Command Query Responsibility Segregation

意思是 命令查詢職責隔離

命令是指 插入、修改、刪除,就是更改數據的動作。

隔離之后,結構就變成了這樣:

image

所以,CQRS 會有兩個數據模型,一個命令模型,一個查詢模型(可以有多個)。

命令模型的數據變更后,需要同步給查詢模型。

這樣做的核心目的就是:

讓數據查詢可以放飛自我

各種復雜的查詢操作再也不用基于單一死板的存儲結構了。

命令模型數據同步過來之后,查詢模型可以根據自己的想法來重新組織數據結構,從而實現想怎么查就怎么查,簡單高效。

這樣就解決了以前單一數據模型帶來的查詢尷尬場面。

這看起來不就是變成2個微服務嗎?

并不是的,微服務的劃分是基于業務領域的,不同的領域才劃分為不同的微服務。

但 CQRS 中的命令模型、查詢模型,它們還是屬于同一領域的,查詢模型不能脫離命令模型,它們是緊耦合的。

所以 CQRS 并不是兩個獨立的微服務。

那么 CQRS 如何同步數據呢?

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

image

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

image

這種方式用的比較多,因為它的可靠性、擴展性都很好,只是會有短暫的數據不一致。

CQRS 看起來很像緩存啊?

是有些類似,但查詢模型并不是單純的用來提升查詢性能的數據鏡像。

查詢模型的本質是用于創建多樣化的數據展現形式。每一種形式適用于某類用戶的需求。

CQRS 的查詢模型可以使用不同的技術實現,例如有些使用關系數據庫,有些使用 Redis ……

CQRS 把數據變更、查詢分離之后,為查詢帶來了最大化的自由,同時呢,也大幅提升了這兩方面的工作效率,相較于之前整合在一起,分開后負載壓力肯定會減輕。這也是 CQRS 帶來的性能優勢。

CQRS 有什么不足?

凡事都有兩面性,很明顯,CQRS帶來了復雜性

之前一體的時候,只有一個數據模型,一套技術。

使用 CQRS 之后,至少就要有 2 個模型,使用的技術也會增加。

還要保持數據的同步,開發維護的任務自然更重了。

還有數據一致性的問題,如果使用同步方式,一致性強,但跨數據源的實時同步可不容易,寫入性能必然下降,失敗的概率也會增加。

如果使用異步方式,那就要考慮數據延遲問題,在需要立即看到變化結果的場景就不能使用了。

小結一下,CQRS 把數據的變更和查詢拆開了,有各自的數據模型。

命令模型負責數據的變更,并把最新數據同步給命令模型。

命令模型根據自己的想法來安排數據,想怎么用就怎么用。

好處是可以讓查詢更加自由,更快的滿足多變的業務需求。

壞處是增加了架構的復雜度,還有數據同步帶來的問題。

我們可以根據自己的實際情況來抉擇。

推薦閱讀

OAuth2 圖解

輕松理解 Kubernetes 的核心概念

開發者必須要了解的架構技術趨勢:Service Mesh

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,156評論 6 529
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,866評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 174,880評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,398評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,202評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,743評論 1 320
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,822評論 3 438
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 41,962評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,476評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,444評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,579評論 1 365
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,129評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,840評論 3 344
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,231評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,487評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,177評論 3 388
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,568評論 2 370

推薦閱讀更多精彩內容