代码编织梦想

目录

一、什么是CQRS

二、为什么要用CQRS

三、CQRS的使用

四、CQRS的好处

五、CQRS的缺点

六、何时使用CQRS

总结


一、什么是CQRS

Greg Young 在 2010 年创造了CQRS(Command Query Responsibility Segregation)架构模式。

CQRS是基于CQS,CQS (命令查询分离)设计模式建议将对象的方法映射到两类:方法要么改变对象的内部状态,但不返回任何内容,要么只返回元数据。这种方法称为Command。或者一个方法返回信息但不改变内部状态。这种方法称为Query。

命令查询职责分离(Command Query Responsibility Segregation,CQRS),是一种读写分离模式,旨在从业务上分离命令(Command,也就是写操作)和查询(Query,读操作)的行为。从而使得逻辑更加清晰,便于开发人员对不同部分进行针对性的优化。

由CQS演变而来的CQRS 的核心思想是将这两类不同的操作进行分离,然后在两个独立的service中实现。这里的service一般是指两个独立部署的应用。在某些特殊情况下,也可以部署在同一个应用内的不同接口上。

二、为什么要用CQRS

传统的开发方式,就是读写都是用的同一个模型。如下图所示,请求和返回都是DTO。一个DTO模型就表达了用户所有的CURD的意图了。而且为了适应同时适应查询和创建操作,DTO被设计的面面俱到,也就显得臃肿。从而在传输中存在不必要的字段传递。

 有的同学就会问了,那我数据库不也有读写分离吗,你这CQRS不会是新瓶装老酒,拿个新名词来忽悠人的吧。且慢,容我慢慢道来。如果是在传统的开发方式,就算你是数据库读写分离了,你用的数据模型还是同一个,如下图所示。而且每次操作,在DTO与领域对象间进行多次转换,增加了系统复杂度。即使你数据库读写分离了,但是读写模型没有拆分的话,服务的并发瓶颈还是在那里。

在实际应用场景中,读取和写入工作负荷通常是非对称的,具有截然不同的性能和缩放要求。正常都是读多写少,同时读取的接口有各式各样的参数回显需求。而写入的话,一般的数据都是比较固定的。同时数据查询都不会改变数据库的数据。传统开发方式的读写操作围绕同一数据模型展开,对于读多写少的系统而言效率并不是最高的,特别在读操作为主的高并发系统中缺点就尤为突出。

三、CQRS的使用

鉴于传统开发模式的高并发短板,因此,我们把读写模型进行拆分。CQRS根据读写职责的不同,将读取和写入分离到不同的模型,使用命令来更新数据,使用查询来读取数据。这时的模型如下图所示。我们的command model对应到写数据库,query model对应到了读数据库。此时,数据库的读写分离。

红色线部分就是Command端,其对应的是Command Model对其发送Command操作的指令向写数据库中写入数据。

绿色线部分是Query端作为查询操作,通过Query Model向读数据库获取数据,通过蓝色向左的线逐层把数据返回结果给Client

四、CQRS的好处

  • CQRS的好处,读写分离,解决的就是复杂软件系统中的读多写少的问题。
  • 因为读和写的参数不一样,因此要分别定义写接口的参数,和读接口的参数。
  • 写接口一般比较少变动,可以遵守范式来写。
  • 读接口根据业务相对会变动比较多,而且有时候需要直接跨层调用,如从Application层直接调用Infrastructure层。
  • CQRS很适合基于事件的编程模型。CQRS系统被分割成独立的服务,与事件协作进行通信。这使得这些服务可以轻松地利用事件溯源(Event Sourcing)的优势。

五、CQRS的缺点

凡事有利必有弊,使用CQRS,由于读写的模型分离了,首先从代码量上面肯定增加了,更重要的一点便是增加了软件系统的复杂。

CQRS也算是一种开发模式,一种新思想的引入也提高了程序员的开发门槛。

六、何时使用CQRS

以下情况建议使用CQRS模式:

  • 首先便是正文中提到的读多写少的场景。这个时候可以考虑使用CQRS。
  • 读写性能分别的要求,数据读取性能必须独立于数据写入性能进行优化的场景。可以对读和写两方面应用不同的优化策略

以下情况不建议使用此模式:

  • 域或业务规则非常简单。
  • 简单的 CRUD 样式用户界面和数据访问操作就足够了。

总结

本文简单的介绍了CQRS是什么,为啥要用,以及优缺点。在实际使用过程中,CQRS往往会结合事件溯源Event Sourcing一起使用的。这个在本篇文章里没有详细展开,有兴趣的同学可以自行搜索资料进行拓展阅读,我也会在后面整理相关资料,以及配上对应的工程实例帮助大家理解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhh763984017/article/details/127527387

浅谈CQRS架构-爱代码爱编程

   我们在对数据库的操作时,可以进行读写分离,但是我们的业务层却没有做到读写分离,因为业务的读和写都是公用一个 model对象,需要进行一些并发的控制。           cqrs(Command Query responsibility segregation) Command就是包含增删改,query就是查询,通过这种分离的好处就是可以分别对C

【高考加油】高考后,为什么要学编程?-爱代码爱编程

前言 尽管现在已然是一只被社会毒打的社畜,但是想起高考仿佛就在昨天 尽管高考已经过去了很久很久。 希望明天考试的小朋友的考的都会,写的都对 一些小建议 读书不是唯一的出路 一场考试,根本不能决定你将来的人生,但做好这件事情,你会很受益!高考加油! 读书并不是你唯一的出路,但是在你找到其他更好的出路之前,请好好读书。 在好好读书之余,也请多享受生活,

程序员必备技能——正则表达式-爱代码爱编程

目录 前言 一、什么是正则表达式 二、元字符 三、数量限定符 五、贪婪匹配和惰性匹配 5.1 惰性匹配 .*? 5.2 贪婪匹配 .* 六、不同语言的正则表达式 6.1 Python示例 6.2 C#示例 6.3 Golang示例 总结 写在后面 前言 当我们在通过爬虫抓取网页数据的时候,请求回来的网页数据其实是一个很长很长的

【Ubuntu】初装Ubuntu后,开发必做的五件事情-爱代码爱编程

前言 最近因为需要,重新入坑Ubuntu,好巧不巧,重温了几年前,搭建环境时的痛苦。 本次踩坑专门记录,以便以后自己更快填坑。当时咋就没有留个镜像啥的呢?再生龙他不香吗? Ubuntu版本:18.04 一、修改本机语言 很多人,包括我,在安装Ubuntu的时候,会选择中文。 但是,实际上有些软件的路径还是不支持中文的。既然采用Linux系统了,

浅谈CQRS模式-爱代码爱编程

文章目录 背景:CQRS简介:原作者Greg Young对CQRS的说明:对CQRS的一些误读:总结: 背景: 笔者在刚开始尝试实践DDD模式时,时常会觉得DDD模式相当笨重,尤其是在面对来自UI的各种不同维度的查询时,相当的繁琐: 如果遵循DDD的设计原则,那么就应该只有聚合根才能持有Repository,我们需要先根据VO构建聚合根,再通

程序员的成长之路——道和术的思考_攻城狮白玉的博客-爱代码爱编程

前言 受邀在C站的专家圈社群里进行分享,以下是本次分享的全文。 自我介绍 我叫郑皓桦,是一名全栈工程师。csdn名字是攻城狮白玉。 因为本人的专业经验和经历都没有群里各位专家的丰富。今天就由自身经历出发,为大家带来一个开放性的问题来与大家讨论。今天想与各位专家讨论的是——《程序员的成长之路——道和术的思考》。 在开始之前,我想定义几个名词,一个是

安卓开发-基础知识补习7_melody&aurora的博客-爱代码爱编程

听说点赞关注的人,身体健康,万事如意,工作顺利,爱情甜蜜,一夜暴富,升职加薪……最终迎娶白富美!!! ‼️微信公众号:炜煜工作室 🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱

【1024随笔】程序人生的许多个第一次_攻城狮白玉的博客-爱代码爱编程

前言 今天1024,那就水一篇文章,写篇随笔,记录回顾一下自己的历程。 从大学时进入实验室的第一行C代码的hello world。学习到C51时点亮的第一盏LED灯,再到STM32平衡车,后来的后端开发。期间接触了不同的编程语言,我愿称之为工具。每一个不同的工具都让我领略到了其特有的魅力。不知不觉也已经接触编程世界第七个年头了。 许多个第一次 第一

(附源码)计算机毕业设计ssm丽雅小区物业管理系统_嘉应学长的博客-爱代码爱编程

(附源码)计算机毕业设计SSM丽雅小区物业管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM + mybatis + Maven + Vue

五一劳动节随笔——想要坚持,就得放弃宏大目标-爱代码爱编程

为啥老是更不了文 作为鸽王,想想也停更博客,停更公众号很长很长一段时间了,最近这段时间,零零散散地有记录一些笔记,却总因为自己的懒惰而迟迟没有整理成文,很多时候就是想更,却仅仅只是想着。这大概就是泰戈尔说过的“想着做好事的人,没有做好事”。我何尝不是那个想更文,却又迟迟未更的博主呢?   想起了去年2021年给自己立下了几个flag,要2022年