命令查詢職責分離 (CQRS)

CQRS 的最初需求

多年來,傳統的 CRUD(創建、讀取、更新、刪除)模式一直是系統架構的支柱。在 CRUD 中,讀取和寫入操作通常由相同的數據模型和相同的數據庫模式處理。雖然這種方法簡單直觀,但隨著系統規模的擴大和需求變得更加復雜,它的效率就會降低。

例如,考慮一個擁有數百萬用戶的大型電子商務應用程序。該系統可能面臨相互沖突的需求:它需要快速讀取產品詳細信息、評論和用戶配置文件,但它還必須有效處理數千筆交易、庫存更新和訂單下達。隨著讀取和寫入操作的增長,對兩者使用單一模型可能會導致瓶頸,影響性能和用戶體驗。

CQRS 模式的基礎知識

CQRS 的引入是為了解決這些擴展挑戰。該模式的本質就在于它的名字——命令查詢職責分離。在這里,命令負責系統狀態的任何更改(例如下訂單或更新用戶配置文件),而查詢則處理數據檢索,沒有任何副作用。

在 CQRS 系統中,這兩個操作被視為完全不同的職責,通常具有單獨的數據模型、數據庫,甚至單獨的服務器或服務。這使得每個操作都可以獨立于另一個進行調整、縮放和維護,并與每個操作的特定需求保持一致。

CQRS 組件

命令

命令是在系統內執行操作或更改的指令組件。它們的命名應反映意圖和上下文,例如PlaceOrder或UpdateUserProfile。重要的是,命令應該負責更改,因此不應返回數據。進一步探索命令如何處理驗證、授權和業務邏輯將闡明它們在 CQRS 模式中的角色。

查詢

另一方面,查詢處理所有數據請求操作。重點可能在于如何構建這些來提供針對特定用例定制的優化的、非規范化的數據視圖。您可以深入研究構建和優化查詢服務的不同策略,以處理潛在的復雜讀取模型。

命令和查詢處理程序

處理程序充當促進命令和查詢執行的代理。命令處理程序負責執行與數據突變相關的邏輯,同時確保遵守驗證和業務規則。查詢處理程序管理數據的檢索,可能涉及復雜的聚合或連接以形成請求的讀取模型。

單數據庫與雙數據庫方法

單一數據庫

在此模型中,命令和查詢操作都在單個數據庫上執行,但具有不同的模型或模式。即使這兩個操作共享相同的物理存儲,它們也可能使用針對其特定要求而優化的不同表、視圖或索引。

它可以表示如下:

圖片

好處

  • 簡化基礎設施并減少開銷

  • 立即一致性,因為寫入和讀取操作之間沒有延遲

權衡

  • 在大量并發操作期間,共享資源仍然可能成為瓶頸。

  • 獨立調整和縮放操作的靈活性較低

雙數據庫方法

在這里,命令和查詢操作完全分開,使用兩個不同的數據庫或存儲系統。寫數據庫專用于處理命令,而讀數據庫則服務于查詢操作。必須添加手柄同步系統。

它可以表示如下:

圖片

好處

  • 每個操作的單獨調整、縮放和優化

  • 每個數據庫有可能托管在不同的服務器或服務上,分配負載;數據庫解決方案也可能有所不同,以便為特定需求提供更多的模塊化。

權衡

  • 為確保兩個數據庫之間的數據一致性帶來了復雜性

  • 需要同步機制來橋接寫入和讀取數據庫之間潛在的錯位或延遲:例如,寫入操作可能會更新命令數據庫,但讀取數據庫可能不會立即反映這些更改。為了解決這個問題,同步技術的范圍可以從簡單的輪詢到更復雜的方法,例如事件源,其中修改被捕獲為一系列事件并重放以更新讀取的數據庫。

單一數據庫方法提供了簡單性;雙數據庫配置提供了更大的靈活性和可擴展性,但代價是增加了復雜性。這些方法之間的選擇取決于相關系統的具體要求和挑戰,特別是圍繞性能需求和一致性要求。

CQRS 模式的優點和權衡

好處

  • 性能優化:通過分離讀寫邏輯,可以獨立擴展和優化各個方面。例如,如果系統讀取量很大,您可以分配更多資源來處理查詢,而不會因寫入操作的需求而陷入困境。

  • 靈活性和可擴展性:通過單獨的讀取和寫入模型,可以更輕松地在一個模型中引入更改,而不會影響另一個模型。這種隔離不僅可以實現更敏捷的開發和更輕松的可擴展性,還可以針對與急切實體加載相關的常見問題提供保護。通過明確地處理讀取和寫入,可以優化系統以避免不必要的數據加載,從而提高性能并減少資源消耗。

  • 簡化的代碼庫:分離命令和查詢邏輯可以使代碼庫更易于維護且不易出錯。每個模型都有明確的職責,減少了由于相互交織的邏輯而引入錯誤的可能性。

權衡

  • 數據一致性:由于讀寫模型可能不同,實現數據一致性可能具有挑戰性。CQRS 通常與“最終一致性”模型齊頭并進,這可能并不適合所有應用程序。

  • 復雜性開銷:引入 CQRS 會增加復雜性,尤其是與事件溯源等其他模式配合使用時。評估所獲得的好處是否超過增加的復雜性至關重要。

  • 增加開發工作量:擁有獨立的讀寫模型本質上意味著維護系統的兩個不同部分。這會增加初始開發工作量以及持續的維護開銷。

結論

CQRS 提供了一種變革性的數據管理方法,在性能、可擴展性和代碼清晰度方面帶來了顯著的優勢。然而,這并不是靈丹妙藥。與所有架構決策一樣,采用 CQRS 應該是一個經過深思熟慮的選擇,要考慮到它的好處和它帶來的挑戰。對于可擴展性和性能至關重要且可以接受權衡的系統,CQRS 可以改變游戲規則,將系統的穩健性和響應能力提升到新的高度。


作者:Artem Artemev

更多技術干貨請關注公號【云原生數據庫

squids.cn,云數據庫RDS,遷移工具DBMotion,云備份DBTwin等數據庫生態工具。

irds.cn,多數據庫管理平臺(私有云)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166192.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第99步 深度學習圖像目標檢測:SSDlite建模

基于WIN10的64位系統演示 一、寫在前面 本期,我們繼續學習深度學習圖像目標檢測系列,SSD(Single Shot MultiBox Detector)模型的后續版本,SSDlite模型。 二、SSDlite簡介 SSDLite 是 SSD 模型的一個變種&#xff0c…

竹云參編《公共數據授權運營平臺技術要求》團體標準正式發布

2023年11月23日,第二屆全球數字貿易博覽會“數據要素治理與市場化論壇”于杭州成功召開,國家數據局黨組書記、局長劉烈宏,浙江省委常委、常務副省長徐文光出席會議并致辭。會上,國家工業信息安全發展研究中心發布并解讀了我國首部…

[Linux] 馮諾依曼體系結構 與 操作系統

文章目錄 1、馮諾依曼體系結構2、操作系統 1、馮諾依曼體系結構 馮諾依曼結構也稱普林斯頓結構,是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。程序指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數據的寬度相…

【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現省市地區三級聯動地址選擇器組件(下)

文章目錄 概述端云調用流程端側集成AGC SDK端側省市地區聯動的地址選擇器組件開發創建省市數據模型創建省市地區視圖UI子組件創建頁面UI視圖Page文件 打包測試總結 概述 我們在前面的課程,對云開發的入門做了介紹,以及使用一個省市地區聯動的地址選擇器…

三次輸錯密碼后,系統是怎么做到不讓我繼續嘗試的?

1故事背景 忘記密碼這件事,相信絕大多數人都遇到過,輸一次錯一次,錯到幾次以上,就不允許你繼續嘗試了。 但當你嘗試重置密碼,又發現新密碼不能和原密碼重復: 圖片 相信此刻心情只能用一張圖形容&#xf…

Mobaxterm 使用lrzsz傳輸文件(rz/sz)

Mobaxterm 使用lrzsz傳輸文件報錯 1. 現象 最近從xshell切換到Mobaxterm其他一切正常,就是使用rz傳輸文件時會出現錯誤,比較苦惱. 會出現以下錯誤 [rootcentos7 rpmbuild]# rz ?CCCCCCCCCCC23be50ive.**B0100000023be502. 解決方法 去官網(https://mobaxterm.mobatek.net…

2021年03月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 在《采礦》游戲中,當角色撿到黃金時財富值加1分,撿到鉆石時財富值加2分,下面哪個程序實現這個功能? A: B: C: D: 答案:D A將變量值固定,BC為雙重判斷

練習七-在Verilog中使用任務task

在Verilog中使用任務task 1,任務目的2,RTL代碼,交換3,測試代碼4,波形顯示 1,任務目的 (1)掌握任務在verilog模塊設計中的應用; (2)學會在電平敏感…

Android Studio記錄一個錯誤:Execution failed for task ‘:app:lintVitalRelease‘.

Android出現Execution failed for task :app:lintVitalRelease.> Lint found fatal errors while assembling a release target. Execution failed for task :app:lintVitalRelease解決方法 Execution failed for task ‘:app:lintVitalRelease’ build project 可以正常執…

〖大前端 - 基礎入門三大核心之JS篇?〗- DOM事件對象及它的屬性

說明:該文屬于 大前端全棧架構白寶書專欄,目前階段免費,如需要項目實戰或者是體系化資源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作經驗, 從事過全棧研發、產品經理等工作&#xf…

進程已結束,退出代碼-1073741571 (0xC00000FD)

今天遇到了一個很邪門的問題,沒有報錯,只是提示“進程已結束,退出代碼-1073741571 (0xC00000FD)”。后來查資料說是棧溢出。 出問題的應該是上面這段代碼。 這里我想把一個128*128的矩陣進行剪枝操作。 傳入的128*128的矩陣太大了,兩組for循…

介紹GLFW庫和OpenGL和GLEW庫三者之間的關系

具體來說,OpenGL是一個開放的圖形庫,它規定了每個函數應該如何執行,以及它們的輸出值,但沒有具體實現。它提供了渲染2D和3D圖形的標準或規范。 GLEW,全稱OpenGL Extension Wrangler Library,是一個用于管理…

【Flink】狀態管理

目錄 1、狀態概述 1.1 無狀態算子 1.2 有狀態算子 2、狀態分類 ?編輯 2.1 算子狀態 2.1.1 列表狀態(ListState) 2.1.2 聯合列表狀態(UnionListState) 2.1.3 廣播狀態(BroadcastState) 2.2 按鍵分…

Redis Transaction事務

Redis 事務的目的是方便用戶一次執行多個命令。執行 Redis 事務可分為三個階段: 開始事務命令入隊執行事務 Redis事務特性 Redis 事務具有兩個重要特性: 1) 單獨的隔離操作 事務中的所有命令都會被序列化,它們將按照順序執行&#xff0c…

圖像標記上線,描點信息盡在掌握丨三疊云

圖像標記 路徑 表單設計 >> 組件 >> 增強組件 功能簡介 「圖像標記」字段是「增強字段」類型字段。用戶通過上傳圖片的方式構建一個背景圖片,并在構建的圖片背景上添加描點信息。搭配「儀表盤」中的「圖像軌跡」,可繪制出相應的數據軌跡…

界面組件DevExpress Reporting v23.1 - Web報表設計器功能升級

DevExpress Reporting是.NET Framework下功能完善的報表平臺,它附帶了易于使用的Visual Studio報表設計器和豐富的報表控件集,包括數據透視表、圖表,因此您可以構建無與倫比、信息清晰的報表 界面組件DevExpress Reporting v23.1已經發布一段…

基于JavaWeb+SSM+Vue微信閱讀小程序的設計和實現

基于JavaWebSSMVue微信閱讀小程序的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄[Java 源碼獲取 源碼獲取入口 Lun文目錄 第1章 緒論 1 1.1 課題背景 1 1.2 課題意義 1 1.3 研究內容 1 第2章 開發環境與技術 3 2.1 MYSQL數據庫 3 2.2 JSP技…

2016年8月15日 Go生態洞察:Go 1.7版本發布

🌷🍁 博主貓頭虎(🐅🐾)帶您 Go to New World?🍁 🦄 博客首頁——🐅🐾貓頭虎的博客🎐 🐳 《面試題大全專欄》 🦕 文章圖文…

解決traefik/nginx-ingress-controller配置正確的情況訪問域名仍然報錯: Connection Refused的問題

最近碰到一個很奇怪的問題: traefik/nginx-ingress-controller配置正確,但是訪問ingress配置的host域名就是死活報錯: Connection Refused 這樣怎么也找不到原因,然后一咬牙直接在其中一臺節點yum安裝nginx, 通過直接反向代理的方…

微信小程序開發資源匯總

本文收集了微信小程序開發過程中會使用到的資料、問題以及第三方組件庫。本文不是一篇關于如何學習微信小程序的入門指南,也非參考手冊,只是一些資料的整理。 本倉庫中的資料整理自網絡,也有一些來自網友的推薦。 官方文檔 小程序設計指南…