精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何寫出簡潔的 CQRS 代碼?

開發 架構
命令和查詢責任分離(CQRS)是指將數據存儲的讀取和更新操作分開的一種模式。實施 CQRS 據稱可以提高性能、可擴展性和安全性。遷移到 CQRS 模式所創造的靈活性,使系統能夠隨著時間的推移而更好地發展。

 命令和查詢責任分離(CQRS)是指將數據存儲的讀取和更新操作分開的一種模式。實施 CQRS 據稱可以提高性能、可擴展性和安全性。遷移到 CQRS 模式所創造的靈活性,使系統能夠隨著時間的推移而更好地發展。不過 CQRS 模式有一些眾所周知的陷阱,本文介紹了三種實用的場景。

CQRS 模式可以創造奇跡:它可以將可擴展性、性能、安全性最大化,甚至可以打破 CAP 定理 (1)。盡管如此,CQRS 還是因為其引入的復雜性而獲得了一個有爭議的名字。例如,Martin Fowler 在其 CQRS 文章 (2) 中認為,應該少用甚至謹慎地應用該模式。

  • 對大多數系統來說,CQRS 增加了風險的復雜性
  • 你應該非常謹慎地使用 CQRS
  • 雖然 CQRS 是工具箱中的一種模式,但要注意的是,它很難用得好,如果處理不當,很容易搞壞你重要的部件。

從我的觀點來看,CQRS 帶來的復雜性在很大程度上是偶然的,也是可避免的。為了說明我的觀點,我想先討論一下 CQRS 的目標,然后分析一下基于CQRS 系統中常見的三個復雜性的來源。

CQRS 的目標

CQRS 的目標是使用多種模型來表示相同的數據,與可擴展性、可用性、安全性、性能都沒有關系。在多個模型中表示相同的數據,這就是目標,剩下的都是副產品。不信?聽聽 Greg Young 在 DDDEU2016 大會上的演講 (3) ,他說 CQRS 是為了支持 Event Sourcing (事件溯源)實現而發明的。而且大家可能都知道,Event Sourcing 模型對于寫數據來說很強大,但是對于讀數據來說卻很糟糕,這就是當年他需要 CQRS 的原因:用多個模型來表示相同的數據。

CQRS 是如何實現這個目標的?通過確保只有一個模型作為數據的源頭,所有的修改都通過這個模型來達到。

讓我們來看看這個解讀如何幫助我們解決一些復雜的問題。

復雜性陷阱一:單向命令,或者說過度的隔離

據我所知,所有的 CQRS 的定義都遵循這個模式。

  1. CQRS 是基于 CQS 原則,它指出,操作應該被分為兩組:改變數據的命令和查詢數據的命令。一旦我們將這一原則提升到架構層面,我們就會得到一個系統,用例被隔離成相同的兩組:命令和查詢。每個用例既可以是命令,也可以是查詢,但絕對不能同時是命令和查詢。
  2. 一旦用例被隔離,我們會得到很多好處:多種模型、不同的持久化機制、獨立的可擴展性等。

你是否感覺到這里有什么問題?這個問題很微妙:所有的 CQRS 定義通常都是從解決方案 — 隔離開始,之后才定義問題 — 多模型。這就導致了對隔離太過熱衷:甚至將命令定義為單向的,操作服務器只返回 Ack/Nack 響應,必須輪詢一些讀模型存儲的實際命令才能返回結果。換句話說,復雜度如地獄式的釋放。

解決辦法:放寬隔離

讓我們退一步,重新考慮一下隔離的問題。我們已經看到,根據 CQRS 的說法,為了在多個模型中表示相同的數據,一個用例既可以寫數據,也可以讀數據。讀取模型不應該更新任何東西,這一點是不言而喻的,否則我們最終會有多個數據來源。但是,你真的應該讓你的命令空轉嗎?

其實不然,在不違反任何原則的情況下,一個命令可以安全地返回以下數據。

  • 執行結果:成功/失敗。
  • 如果失敗:錯誤信息或驗證錯誤。
  • 如果成功:聚合的新版本號。

這些信息將極大地改善你的系統的用戶體驗,因為:

  • 你不需要向外部來源查詢命令執行結果,你馬上就能得到它。在驗證命令,以及返回錯誤信息方面變得非常簡單;以及
  • 如果你想刷新顯示的數據,你可以使用聚合的新版本來確定視圖模型是否反映了已執行的命令。不會再顯示陳舊的數據了。

說到數據,我們能不能再放寬一點隔離?在很多情況下,受影響的聚合內部包含的任何數據都可以作為命令執行結果的一部分返回。但是,這里有一點細微的差別:確保返回的數據可以在以后從其中一個讀取模型中查詢。否則,在響應沒有到達客戶端的情況下,數據可能會有潛在的丟失風險。

你可以在 Daniel Whittaker 的博客 (4) 中看到這樣一個例子,他在博客中討論了命令執行對象用于驗證命令的使用。

另外,在這個 gist 中 (5) ,你可以看到我在 C# 中使用的命令執行結果對象。

復雜性陷阱二:Event sourcing (事件溯源)

由于歷史原因,CQRS 與 Event Sourcing 模式密切相關。畢竟,CQRS 的發明就是為了讓 Event Sourcing 模式成為可能。但是,讓我們重新評估一下這兩種模式之間的耦合關系。

正如我之前所說,CQRS 的目標是允許在不同的模型中表示相同的數據。如果你正在使用 event source 域模型,你絕對需要 CQRS 來執行查詢。然而,還有很多其他合理的理由來實現 CQRS,這些理由與 event source 無關。

  • 你的系統以不同的表示模型顯示其實體。
  • 你必須支持不同的查詢模型(搜索、圖、文檔等)。
  • 寫入和讀入之間的差異很大,你希望將它們獨立擴展。
  • 你不喜歡 ORM。

這是否意味著在所有這些情況下,你必須走 Event Sourcing 路線?如果你這么做,你就深陷復雜度陷阱。Event source 是一種業務領域的建模方式,也可能是最復雜的方式。因此,只有當你的業務領域證明你的業務領域是合理的,你才應該采用 Event Sourcing。讓我們來看看如何在其他情況下實現 CQRS。

解決方案:CQRS != Event Sourcing

我們已經學會了通過編寫事件處理程序來生成投影。如果沒有事件,如何實現投影?還有一種方法可以實現投影,我稱之為“基于狀態的投影”。這個主題值得單獨寫一個帖子,但我將簡單介紹三種實現“基于狀態的投影”的方法。

1. "臟"標志

你可以通過設置 IsDirty 標志來標記一個被更新的實體,并實現一個投影引擎來查詢臟實例,并將更新的數據投影到不同的模型中。要重建投影,你只需要將所有記錄的 dirty 標志設置就可以了。

2. 追加

在關系型數據庫中,你可以在表層跟蹤提交。例如在 SQL Server 中,你有一個內置的機制,即 "rowversion" 列。這樣的功能也可以在其他關系型數據庫中實現。投射引擎將以類似于補訂的方式查詢更新的行,并將更新的數據進行投影。要從頭開始重建一個投影,必須將上次已知的提交 id “回滾” 到 0。

3. 數據庫視圖

如果你使用的是關系型數據庫,而你需要的只是用不同的模型來表示它的數據,那么數據庫視圖就很好用。沒錯,一個完全有效的 CQRS 系統可以在數據庫中實現。這可能是最不性感的解決方案 — 但它不僅可以工作,還自然地遵循了 CQRS 模式。

這些投影模型的方法可能并不酷,也不性感,但它們是有效的。我見過不少采用了這些方法的項目,它們的效果很好,沒有無端地淹沒在 event source 相關的復雜性中。

等等,我剛才是不是建議不惜一切代價忽略 Event Sourcing,因為它很復雜?當然不是! Event Sourcing 是你工具箱中最重要的工具之一。但是,作為任何工具,請在其上下文中使用它 — 能帶來商業價值的業務領域。核心子領域。另一方面,通用子域和支持子域,這些子域足夠簡單,可以用事務腳本或活動記錄模式實現,但仍然可以從 CQRS 中受益。在這種情況下,使用最簡單的工具來完成工作,并使用基于狀態的預測來獲取 CQRS 的好處。

復雜性陷阱三:好東西太多了

微服務的炒作吸引了很多人對 CQRS 的關注:如果你有一組獨立的服務需要查詢彼此的數據,那么 CQRS 就是通用的解決方案 (6) 。然而我已經看到這種方法產生了巨大的數據流圖,在服務之間投射出大量的數據。

[[325623]]

 

這不一定是壞事,但在很多情況下這可能是一個信號,需要退一步重新考慮你的分解策略。有可能是你的服務過于細化,沒有反映出業務領域的邊界。如果是這種情況,你可以通過將服務邊界與相應的業務域重新對齊,大大降低架構的復雜性。

CQRS:解構

我想用 CQRS 的圖來總結一下。

 

 

此圖與您在網上可以找到的其他圖表不同。

 

這就是我所看到的和實現 CQRS 模式。命令有響應。定義的投射機制是抽象的,與實現細節無關。里面可能是基于事件,或者是基于狀態,甚至是數據庫視圖。最后,沒有事件源(Event Sourcing)。按照業務域的要求,對系統的業務邏輯進行建模:活動記錄、域模型或事件源域模型。

與每一個正確應用的工具一樣,CQRS 應該降低復雜性,而不是誘導復雜性。如果你的體系結構的復雜性增加了,那么你很可能做錯了。

文中相關鏈接:

http://codebetter.com/gregyoung/2010/02/20/cqrs-and-cap-theorem/

https://martinfowler.com/bliki/CQRS.html

https://youtu.be/LDW0QWie21s?t=448

http://danielwhittaker.me/2016/04/20/how-to-validate-commands-in-a-cqrs-application/

https://gist.github.com/vladikk/86da55d0eb09d7a291b9f9a5b406f2c9

https://www.ibm.com/developerworks/cloud/library/cl-build-app-using-microservices-and-cqrs-trs/

英文原文:

https://vladikk.com/2017/03/20/tackling-complexity-in-cqrs/

本文轉載自微信公眾號「高可用架構 」,可以通過以下二維碼關注。轉載本文請聯系高可用架構 公眾號。

責任編輯:武曉燕 來源: 高可用架構
相關推薦

2020-07-15 08:17:16

代碼

2013-06-07 14:00:23

代碼維護

2021-09-01 08:55:20

JavaScript代碼開發

2021-11-30 10:20:24

JavaScript代碼前端

2022-02-17 10:05:21

CSS代碼前端

2022-02-08 19:33:13

技巧代碼格式

2021-01-04 07:57:07

C++工具代碼

2019-09-20 15:47:24

代碼JavaScript副作用

2020-05-19 15:00:26

Bug代碼語言

2020-12-19 10:45:08

Python代碼開發

2022-03-11 12:14:43

CSS代碼前端

2015-09-28 10:49:59

代碼程序員

2019-06-24 10:26:15

代碼程序注釋

2022-10-24 08:10:21

SQL代碼業務

2015-05-11 10:48:28

代碼干凈的代碼越少越干凈

2020-05-14 09:15:52

設計模式SOLID 原則JS

2022-06-16 14:07:26

Java代碼代碼review

2021-07-19 08:24:36

阿里代碼程序員

2017-03-15 13:41:16

數據庫SQL調試

2016-11-25 13:50:15

React組件SFC
點贊
收藏

51CTO技術棧公眾號

亚洲天堂av线| 91久久国产精品91久久性色| 在线 丝袜 欧美 日韩 制服| 欧美福利在线播放| 欧美国产乱子伦| 成人免费激情视频| 国产真实夫妇交换视频| 亚欧洲精品视频在线观看| 在线观看欧美精品| 日本一二三区视频在线| 网站黄在线观看| 日本免费在线视频不卡一不卡二 | 国产一区二区在线不卡| 999久久久精品国产| 日韩精品一区二| 99福利在线观看| 成人福利片网站| 91麻豆精品在线观看| 国产精品成人一区二区三区吃奶| 韩国一级黄色录像| 沈樵精品国产成av片| 亚洲成人黄色网| 99九九精品视频| 欧美大片1688网站| 一道本成人在线| 亚洲人精品午夜射精日韩| www在线观看播放免费视频日本| 久久久精品黄色| 精品国产一区二区三区免费| www.我爱av| 精一区二区三区| 国产精品99久久久久久久久| 丁香六月婷婷综合| 99精品视频网| 久久久久久有精品国产| 国产精品老熟女一区二区| 久久免费av| 中文字幕一区二区精品| 亚洲最大成人综合网| 最新亚洲精品| 亚洲一级免费视频| 性欧美一区二区| 久久不见久久见中文字幕免费| 亚洲国产精品成人精品| 午夜av免费看| 欧美日韩一区二区三区在线电影| 亚洲成人激情视频| 国产日韩视频一区| 97视频一区| 亚洲成人999| 国产a级黄色片| 成人性生交大片免费看中文视频 | 精品欧美激情精品一区| 无码精品a∨在线观看中文| √天堂8资源中文在线| 亚洲主播在线播放| 亚洲日本va| 风流老熟女一区二区三区| 日韩中文字幕区一区有砖一区 | 一区二区视频观看| 啪啪激情综合网| 日韩精品免费一线在线观看| 人妻体内射精一区二区三区| 国内精品免费| 日韩精品在线私人| 妺妺窝人体色WWW精品| 欧美亚洲高清| 久久精品精品电影网| 午夜69成人做爰视频| 国产主播一区| 4388成人网| www.久久网| 国内久久婷婷综合| 国产乱码精品一区二区三区中文 | 日韩有码视频在线| 男人操女人的视频网站| 日韩午夜免费| 国产精品美女久久久久久免费| 97在线播放免费观看| 国产精品影视天天线| 国产一区二区免费电影| 国产片在线观看| 亚洲老妇xxxxxx| 成年人视频观看| 成人国产激情| 欧美成人高清电影在线| jizz日本免费| 天天超碰亚洲| 777777777亚洲妇女| 国产免费一区二区三区四区五区| 久久99热99| 国产一区国产精品| 91在线直播| 亚洲高清不卡在线观看| 中文字幕亚洲乱码| 欧美黑人做爰爽爽爽| www.亚洲男人天堂| 久久黄色精品视频| 国产一区二区在线电影| 欧美理论一区二区| 日韩另类在线| 欧美在线视频全部完| 日本三级日本三级日本三级极| 欧美丝袜丝交足nylons172| 欧美日韩ab片| 亚洲视频一区在线播放| 99久久国产综合色|国产精品| 一区二区三区四区欧美| av福利导福航大全在线| 在线成人免费观看| 无码人妻精品一区二区中文| 亚洲天堂成人| 国产精品自拍小视频| 手机av免费在线观看| 自拍偷拍国产亚洲| www日韩视频| 风间由美一区二区av101| 日韩有码在线电影| 黄色在线免费观看| thepron国产精品| 400部精品国偷自产在线观看| 免费污视频在线一区| 日韩精品视频免费在线观看| 久久精品99国产精| 国产在线视频一区二区三区| 四虎影视永久免费在线观看一区二区三区| 蜜桃视频m3u8在线观看| 精品国产伦一区二区三区免费| 亚洲视频重口味| 麻豆精品国产传媒mv男同| 日本不卡二区高清三区| 神马电影网我不卡| 亚洲欧洲日产国产网站| 国产九色在线播放九色| www.亚洲在线| 国产无限制自拍| 在线精品自拍| 久久免费福利视频| 欧美一级片免费| 亚洲成a人在线观看| 麻豆免费在线观看视频| 中文字幕乱码亚洲无线精品一区| 成人xxxxx| 欧美成人性生活视频| 欧美日本精品一区二区三区| 五月婷婷婷婷婷| 免费在线欧美视频| 亚洲精品在线视频观看| 国产精品亚洲一区二区在线观看| 久久色在线播放| 国产夫妻性生活视频| 尤物视频一区二区| av天堂一区二区| 亚洲美女毛片| 蜜桃久久精品乱码一区二区 | 一本久道久久综合中文字幕| 色婷婷在线影院| 免费一级欧美片在线观看| 一区二区在线观看网站| 日韩激情精品| 国内久久久精品| 日本国产在线| 欧美日韩国产首页| 青青操国产视频| 不卡的av网站| 不卡av免费在线| 香蕉综合视频| 国产伦精品一区二区三区视频黑人| 国产777精品精品热热热一区二区| 精品亚洲国产成av人片传媒| 日韩精品在线一区二区三区| 国产精品国产自产拍高清av| 欧美熟妇另类久久久久久多毛| 99国产精品久久久久久久成人热| 日韩av一级大片| 免费看日产一区二区三区 | 国产福利一区二区三区| 国产v片免费观看| 精品国产91| 成人国产一区二区| 大胆人体一区| 欧美成人免费在线视频| 欧美xxx.com| 日韩午夜电影av| 你懂的国产在线| 亚洲欧洲色图综合| 在线免费观看成年人视频| 精品一区二区三区的国产在线播放| 丁香六月激情网| 欧美日韩一二三四| 国产精品成人一区二区三区| 日本一区二区三区视频在线| 欧美黑人性生活视频| 黄色的视频在线免费观看| 欧美一级欧美三级在线观看| 日本视频免费观看| 亚洲综合色自拍一区| 成人午夜福利一区二区| 岛国精品在线播放| 欧美女同在线观看| 性高湖久久久久久久久| 特级西西人体www高清大胆| 免费看日本一区二区| 99久久无色码| 小说区图片区亚洲| 日韩免费av片在线观看| 欧美videosex性极品hd| 少妇高潮久久久久久潘金莲| 色视频在线观看| 欧美大片在线观看一区二区| 伊人久久国产精品| 色综合久久久久久久| 精品无码人妻一区二区三区| 成人免费在线视频观看| 99久久久无码国产精品衣服| heyzo一本久久综合| 伊人成人免费视频| 毛片av一区二区| 国产视频在线视频| 国产一级久久| 日韩欧美不卡在线| 亚洲欧美一区在线| 黄色网络在线观看| 久久久久国产精品| 一区二区三区在线视频111| 欧美热在线视频精品999| 麻豆91av| 中文字幕伦av一区二区邻居| 国产精品一区二区三区在线观| 精品一区二区三区中文字幕在线 | 亚洲熟妇无码另类久久久| 欧美成人高清| 精品国产无码在线| 91成人精品视频| 色乱码一区二区三区熟女| 久久一本综合| gogogo免费高清日本写真| 欧美freesextv| 在线一区高清| 99热国内精品永久免费观看| 少妇熟女一区二区| 久久久久久久久丰满| 裸体裸乳免费看| 欧美黄色大片网站| 国产精品免费看久久久无码| 欧美福利在线| 国产精品久久久久7777| 亚洲黄色免费| 97国产精东麻豆人妻电影| 男人天堂欧美日韩| 宅男噜噜噜66国产免费观看| 免费看欧美美女黄的网站| 欧美wwwwwww| 国产精品影音先锋| av网页在线观看| 久久麻豆一区二区| 欧美极品jizzhd欧美18| 亚洲色图欧美在线| 久久精品免费av| 欧美日韩中文字幕在线视频| 免费在线不卡av| 6080国产精品一区二区| www.桃色av嫩草.com| 日韩大陆欧美高清视频区| 国产在线视频你懂得| 久久精品国产99国产精品澳门| 污污视频在线| 欧洲s码亚洲m码精品一区| 日本一区二区三区视频在线| 亚洲一区二区久久久久久久| 老司机成人在线| 日韩精品一区二区三区外面| 香蕉视频国产精品| 日本www在线视频| 日韩不卡手机在线v区| 九一精品久久久| 成人爱爱电影网址| 男女全黄做爰文章| 香蕉加勒比综合久久| 国产情侣小视频| 亚洲成av人影院在线观看| 91欧美在线视频| 久久久久久久久久国产精品| 日本成人片在线| 国产三级伦理片| 狠狠狠色丁香婷婷综合久久五月| 三区视频在线观看| 99久久亚洲一区二区三区青草| 波多野吉衣中文字幕| 亚洲欧美日韩国产中文在线| 99热国产在线观看| 欧美精品xxxxbbbb| 深夜福利视频在线免费观看| 久久久成人的性感天堂| 伊人久久视频| 91黄色国产视频| 欧美日韩色图| 大陆极品少妇内射aaaaa| 精品在线免费观看| 蜜桃精品成人影片| 亚洲黄色尤物视频| 又色又爽又黄无遮挡的免费视频| 亚洲精品久久久一区二区三区| 日本中文字幕在线视频| 啪一啪鲁一鲁2019在线视频| 亚洲一区二区三区四区电影| 天天人人精品| 欧美一级播放| 久久无码专区国产精品s| 国产精品成人一区二区三区夜夜夜 | 日本三级小视频| 日韩一级大片在线| 99青草视频在线播放视| 欧美中文在线字幕| 国产suv精品一区| 日韩精品手机在线观看| 喷水一区二区三区| 一区二区三区少妇| 亚洲国产日产av| 国产三级午夜理伦三级| 色噜噜亚洲精品中文字幕| 三上悠亚一区二区| 欧美精品一区三区在线观看| 一区二区高清| 中文乱码人妻一区二区三区视频| 亚洲夂夂婷婷色拍ww47| www.成人精品| 久久av在线播放| 亚洲精品一区av| 一区二区三区四区在线视频 | 亚洲一区二区在线免费观看视频| 国产又爽又黄又嫩又猛又粗| 日韩在线激情视频| 日韩欧美专区| 亚洲一区二区三区四区中文| 欧美aⅴ一区二区三区视频| 日韩精品电影一区二区| 日韩欧美中文字幕在线播放| 性xxxxbbbb| 欧美一级在线亚洲天堂| 久久99视频| 婷婷六月天在线| 国产精品久久久久久妇女6080| 在线观看中文字幕2021| 久久精品91久久久久久再现| av日韩一区| 欧美人与动牲交xxxxbbbb| 国产宾馆实践打屁股91| www青青草原| 亚洲成人久久久久| 一本大道色婷婷在线| 欧美精品一区在线发布| 欧美aaaaa成人免费观看视频| 性生交大片免费全黄| 日韩欧美在线综合网| 国产精品偷拍| 欧美极品色图| 欧美aaa在线| 免费在线黄色网| 亚洲国产成人精品久久| 精品国产免费人成网站| 亚洲精品在线视频观看| 国产精品综合在线视频| 日本在线视频免费观看| 亚洲色图日韩av| 祥仔av免费一区二区三区四区| 黄色片免费在线观看视频| 91小视频在线免费看| 国产无遮挡又黄又爽又色视频| 色婷婷av一区二区三区在线观看| 欧美国产中文高清| 91专区在线观看| 国产精品三级视频| 亚洲精品喷潮一区二区三区| 欧美在线激情视频| 91精品综合久久久久久久久久久| 性xxxxxxxxx| 色香蕉成人二区免费| 91精品久久| 日本不卡一二三区| 国产suv精品一区二区三区| 91精品国产综合久久久蜜臀九色| 麻豆精品一二三| 亚洲欧美日韩精品综合在线观看| 开心九九激情九九欧美日韩精美视频电影 | 中文字幕日韩电影| 亚洲精品一二三**| av网址在线观看免费| 亚洲免费电影在线| 精品视频二区| 97超碰在线播放| 老色鬼久久亚洲一区二区| 久久精品视频免费在线观看| 亚洲性夜色噜噜噜7777| 2020最新国产精品| 国产喷水theporn| 欧美日韩另类在线| 成人在线视频亚洲| 日本精品视频一区| 99久久久免费精品国产一区二区|