成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構設計之解析CQRS架構模式!

開發 前端
在這種架構模式下,命令側的數據變化后及時同步(事件、消息隊列)到查詢側,兩側數據并非實時。

在本文中,我將對此做出詳細解釋。

CQS思想

CQS:命令和查詢分離:Command and Query Segregation。

其核心思想是在任何一個對象的方法可以劃分為兩類:

  • 查詢:獲取數據,返回查詢數據,但不改變數據狀態。
  • 命令:改變數據狀態,不返回任何數據。

CQRS模式的核心設計理念來自于一條設計原則,即單一職責原則。

  • 所謂單一職責原則,指的是一個技術組件只應該負責具體一項職責。

而不應該有多個導致該組件發生狀態變化的操作。

基于CQS的思想,任何一個方法都可以拆分為命令和查詢兩部分,如下:

private int data = 0;
private int update(int value) {
    data += value;
    return data;
}

上述方法既改變了數據,又返回了數據狀態。

如果按照CQS的思想,則該方法可以拆成Command和Query兩部分,如下:

private void update(int value) {
    data += value;
}
private int query() {
    return data;
}

對于命令側是否返回數據實際業務訴求中并不一定能夠完全統一。

比如:

  • 某些業務場景下可能會有返回業務主鍵的訴求,比如下單操作返回訂單號。

基本原則

CQS的主要原則是:

  • 一個方法要么是命令,要么是查詢,但不能兩者兼有。
  • 這種分離有助于提高代碼的可讀性和維護性,因為它明確了方法的用途。

CQRS架構

Command and Query Responsibility Segregation

  • 即命令查詢職責分離,是一種將命令和查詢的責任明確分離的架構模式。
  • 這種模式進一步擴展了CQS的思想,適用于更大規模的系統架構。

架構思想:

CQRS將系統的讀操作和寫操作分離到不同的模型中:

  • 命令模型(Command Model):

處理數據的寫操作(創建、更新、刪除)。

  • 查詢模型(Query Model):
  • 處理數據的讀操作(查詢)。

這種分離可以通過不同的數據模型、數據庫甚至服務來實現,從而優化讀寫性能和可伸縮性。

CQRS 模式的應用非常簡單,如下圖所示:

圖片圖片

假設服務為 UserService,在非CQRS模式下同時包含了查詢和更新服務接口。

public class UserService {
   //  根據id查詢用戶
    UserId getUserId(int userId);
    // 更新用戶
    void updateUser(User user);
}

應用CQRS模式之后的UserService被拆分成了兩個接口,分別承擔查詢和寫職責。

/**
   命令服務
*/
public class UserCommandService {
    void updateUser(UserCommand command);
}
/**
   查詢服務
*/
public class UserQueryService{
    User getUserById(int userId);
}

最終一致性

采用CQRS后,查詢和命令兩側通常會采用獨立的數據模型。

  • 采用CQRS模式并沒有強制要求必須要進行數據模型的分離。

在這種架構模式下,命令側的數據變化后及時同步(事件、消息隊列)到查詢側,兩側數據并非實時。

  • 在一定的延時后兩側數據最終達成一致。

圖片圖片

最后總結

CQRS的使用者可以根據實際情況,將讀寫分離開單獨部署,然后引入領域事件,使用消息隊列做通信。

  • 但是這些都是基于不同業務場景的架構選擇,而非CQRS本身的要求。
  • 實際上CQRS只是一種非常簡單的模式而已,并沒有和事件、消息隊列這些有強關聯。

讀寫分離部署+消息通信:

  • 會帶來額外的系統復雜性和更高的運維成本。

《重構:改善既有代碼的設計》的作者也提醒要小心使用CQRS,不推薦將CQRS復雜化處理。

責任編輯:武曉燕 來源: 月伴飛魚
相關推薦

2024-02-05 08:11:30

架構模式單體

2022-04-02 23:32:42

數據網格架構

2021-07-02 06:54:45

軟件架構模式

2023-06-16 13:34:00

軟件架構模式

2012-10-08 11:16:36

企業應用架構標識映射

2023-09-11 11:18:44

軟件開發架構

2012-10-08 11:18:38

企業應用架構工作單元模式

2012-01-13 10:45:56

企業應用架構

2015-06-02 04:17:44

架構設計審架構設計說明書

2023-07-02 06:47:42

LOFTER系統架構

2020-05-14 14:48:15

架構模式單庫

2024-12-24 11:01:58

2024-11-08 09:41:02

2023-04-13 08:23:28

軟件架構設計

2023-12-13 08:31:23

2015-06-02 04:34:05

架構設計

2023-07-27 06:51:46

Android架構模式

2020-12-29 19:15:04

架構模式代碼分布式

2022-06-14 11:01:37

架構模式開發

2010-04-08 09:27:04

PHP設計模式結構模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区成人 | 亚州无限乱码 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲三级在线 | 亚洲精品一区av在线播放 | 亚洲美女在线一区 | 91观看 | 国产精品一区二区免费看 | 精品国产一区久久 | 91久色| 日日操夜夜操天天操 | 日韩精品一区二区三区中文在线 | 精品美女 | 女朋友的闺蜜3韩国三级 | 国产精品日日摸夜夜添夜夜av | 亚洲精品国产综合区久久久久久久 | 欧洲亚洲一区 | 麻豆av一区二区三区久久 | 日日日操 | 国产精品欧美一区二区三区不卡 | www.se91| 九色网址 | 国产亚洲精品久久久久动 | 日本不卡视频 | 久久i| 看av网 | 欧一区二区 | 天天爱天天操 | 日韩中文在线 | 美女久久久久久久 | 日韩在线小视频 | 午夜精品久久久久久久 | 久热精品在线观看视频 | 国产亚洲成av人片在线观看桃 | 色婷婷综合成人av | 久久久久久国产免费视网址 | 午夜视频导航 | 亚洲欧美日韩在线不卡 | 五月婷婷 六月丁香 | av毛片免费| 自拍偷拍小视频 |