Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

  • 计算机基础

  • 框架|中间件

  • 架构

    • 分布式

    • 高并发

    • 高可用

    • 架构

      • 《大型网站技术架构》笔记
      • 系统设计
      • Domain-Driven Design入门
      • CQRS
        • 命令查询分离 CQS
        • CQRS
      • 设计原则
  • 后端
  • 架构
  • 架构
Marvel
2023-09-19
目录

CQRS

# CQRS

# 命令查询分离 CQS

CQRS 的内容基于 CQS 设计模式

命令查询分离(Command Query and Segregation, CQS)的核心思想是任何一个对象的方法可以划分为两类:

  • 查询 Query:获取数据,返回查询数据,但不改变数据状态
  • 命令 Command:改变数据状态,不返回任何数据

根据 CQS,一个方法永远不应该同时存在。比如看栈的典型数据结构,push函数是一个命令,而top是一个查询。最后,pop 函数违反了 CQS 模式,因为它修改了堆栈的内部状态并同时返回信息。

因此,CQS 的核心是在单个对象上分离写入和读取。当代码要并行执行时:由于没有副作用,查询可以并行化而没有任何问题,但命令不能。

# CQRS

Command and Query Responsibility Segregation,即命令查询职责分离,由Greg Young提出 。CQRS 在 CQS 基础之上,将分离的级别从代码方法级别扩展到对象级别。

CQRS 最大优势就是基于这种职责分离能带给我们更多的架构属性选择。

  • “查询” 和 “命令” 两侧进行独立部署以获取更好的伸缩性
  • “查询” 和 “命令” 两侧独立架构设计
  • “查询” 和 “命令”两侧进行独立数据模型设计

团队引入CQRS模式之后,往往不仅仅是简单的在类的职责层面对读写进行分离,一般会采用更为复杂的应用架构风格,如下是典型的CQRS架构风格:

img

  • 命令侧:命令侧引入命令总线以支持对不同命令的灵活路由;突出领域模型的应用
  • 查询侧:引入查询总线对查询请求进行路由;请求链路一般直接连接到存储层,实现不同的定制化查询需求
编辑 (opens new window)
上次更新: 2023/11/24, 11:23:07
Domain-Driven Design入门
设计原则

← Domain-Driven Design入门 设计原则→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式