weblab-tw / ddia-study-group

Designing Data-Intensive Applications Study Group
36 stars 5 forks source link

第五章節:關於 CQRS - Kyle #58

Open kylemocode opened 2 years ago

kylemocode commented 2 years ago

在讀這章資料庫的讀寫分離的時候讓我想到之前偶然看過的 CQRS (Command Query Responsibility Segregation,命令查詢分離)架構,也有人同樣稱它為「讀寫分離」,自己有點沒有很懂 CQRS 的定義,以及 DB 的讀寫分離算不算是 CQRS 的實踐?或者是說兩者完全沒有關係?

目前自己觀察到的關於 CQRS 特性:

目前專案大致上的架構

截圖 2022-07-12 下午3 30 16

這問題可能有點菜,但真的一直搞不清楚QQ

jxiu0129 commented 2 years ago

\跪求再一篇「假詢問真分享文」/

Parkerhiphop commented 2 years ago

我最近才開始碰 CQRS,前幾天看到的文章來理解 CQRS 是一種分散式系統的實作概念,實作上感覺就是在做讀寫分離(但好像也不能這麼簡化)。 而在 DB 跟 Application 端都有各自的實踐方式,DB 的實踐之一就是本章講的 Replication,而 Application 的實踐就是用 Query & Command 來分別讀寫。

Screen Shot 2022-07-13 at 12 35 21 AM Screen Shot 2022-07-13 at 12 35 35 AM

基本上就是從這篇搜尋 CQRS 很前面的文章看來的,再求大神分享 >< https://medium.brobridge.com/%E6%B7%BA%E8%AB%87-cqrs-%E5%AF%A6%E7%8F%BE%E6%96%B9%E6%B3%95-3b4fcb8d5c86

補充 NestJS 有內建 CQRS Module https://docs.nestjs.com/recipes/cqrs

AK4codee commented 2 years ago

呀真巧 我公司就是用 CQRS 其實我在準備面試時有試圖了解一下 CQRS ,也覺得不太理解 實際操作起來...就真的只是讀寫分離(如果我沒漏看甚麼的話)

基本上就是會分 Query & Command 兩個 SQL,API 如果是 GET 就是從 Query(Read-Only) 撈資料;如果是 POST 就是寫入 Command 那邊的資料庫。(我覺得我講的真爛XD) MySQL 可以設定主從資料庫同步(雖然我還沒開始研究怎麼做),通常主是 Command,從是 Query,MySQL 會自動同步主庫的資料到從庫,這樣可以保持 Query 在 Read-only 的情況下更新寫入的資料。

另外,我們也有使用 MediatR 建立 Handler 處理 Command 事件,簡單做到 CQRS 架構上的分層。(但這邊感覺偏實作)

Parkerhiphop commented 2 years ago

你在讀時,就不要寫,反之亦然,一次做一件事。 Redux 其實也能算接近的概念。

Event Soucring

DDD

CQRS 其實處理的是複雜的狀態變化、命令,不一定是查詢 像是當 Application 很大時,一個 Event 會有很複雜的命令操作。