3种CQRS架构模式
命令/查询分离(CQS)
1988 年,Bertrand Meyer 在面向对象的软件设计一书中设计了 CQS 原则。简单来说,这个原则是说程序应当要么修改系统(Command),要么返回查询结果(Query),软件中应当保持命令与查询的分离。
尽管 Martin Fowler 在他 2005 年的博客文章中也提到,这种分离并非总是可能的,一个很好的例子是返回一个刚插入的记录的 id。首先,你要把记录持久化(Command),其次,你要获得它新分配的 id(Query)。
CQRS 架构
CQRS 建议将应用程序层分为两个方面,即命令端(Command)和查询端(Query)。
查询端负责优化读取数据。从持久化获取数据,然后将它们映射到展现层表单,这些表单通常被标识为数据传输对象(DTO)。
命令端关注优化写入数据。命令执行各种用例,修改实体状态并将其持久化。
通过分离读写操作,我们提高了性能,并在系统中支持关注点分离原则。
本文介绍 3 种主要的 CQRS 架构实现。
单数据库 CQRS
单一数据库CQRS 模式没有正式名称,Mattew Renze 在他的课程Clean Architecture 中将其命名为单一数据库 CQRS,我也选择这个命名。
单数据库CQRS
顾名思义,双方都在和一个数据库对话。Command 在域中执行用例,从而修改实体的状态,然后通过 ORM 如 Entity Framework Core 或 Hibernate 将实体保存到数据库中。
Query 直接通过数据访问层执行,数据访问层要么是使用各种 ORM,要么通过存储过程。
双数据库 CQRS
在“双数据库”方式中,我们需要两个数据库,一个用于写操作,一个用于读操作。命令端使用针对写操作优化的数据库。查询端使用针对读取操作优化的数据库。
双数据库CQRS
命令每改变一个状态,修改后的数据就必须从写数据库推送到读数据库中,或者作为一个跨两个数据库的分布式事务,或者使用最终一致性模型。
这种架构给软件的查询端带来了数量级的性能提升,这是有利的,因为一般系统在读数据上花费的时间一般比写数据要更多。
事件源 (Event source) CQRS
最后一种是最复杂的 CQRS 架构。与前面两种方式相比,事件源存储数据的思路完全不同。
在事件源方法中,我们并不只存储实体的当前状态,而且将实体发生的每一个状态作为快照来存储。实体并不是以标准化数据的形式保存,而是通过事件的时间戳来保存它们的变更。
事件源CQRS
事件源带有以下好处:
事件存储包括完整的审计跟踪,可以在需要严格监管的场景中派上用场。
可以在任何时间点重建任何实体的任何状态,这对于调试非常有用。
可以重放事件,查看系统中任何时候到底发生了什么。这个功能对于压力测试和 bug 修复非常有用。
可以轻松地重建生产数据库。
有多个为读优化的数据存储。
但在另一方面,这种方式实现很复杂,如果你不能从其中受益,那么用这个模式可能适得其反。
小结
CQRS 真正的威力在于可以对写和读操作进行不同的优化。但在另一方面,系统会变得更加复杂,命令端和查询端代码不完全一致。并且由于存在多个数据库,管理更复杂,需要更繁琐的 ORM 映射。
文中链接:
clean architecture https://www.pluralsight.com/courses/clean-architecture-patterns-practices-principles
Command-query separation https://en.wikipedia.org/wiki/Command%E2%80%93query_separation
Martin Fowler’s 谈 CQS https://martinfowler.com/bliki/CommandQuerySeparation.html
分离点关注1 https://en.wikipedia.org/wiki/Separation_of_concerns
分离点关注2 https://www.goodreads.com/quotes/tag/separation-of-concerns
最终一致性 https://theacetechnologist.com/post/eventually-consistent-architecture-pattern/
英文原文:
https://levelup.gitconnected.com/3-cqrs-architectures-that-every-software-architect-should-know-a7f69aae8b6c
3种CQRS架构模式相关推荐
- 简述3种CQRS架构模式
简述3种CQRS架构模式_朱小厮的博客-CSDN博客 团队开发框架实战-CQRS架构 - 简书 关注点分离是一种有效整理架构思想的技巧,你应当把注意力集中在一个方面. Edsger W. Dijkst ...
- 详解 CQRS 架构模式
从一开始,软件系统就被用于各种用途,针对它们的需求也随着时间的推移而增长.需求的变更可能与业务逻辑.伸缩性或系统的其他方面有关. 为了满足这些相互矛盾或重叠的需求,工程师必须在设计系统时做出各种各样的 ...
- 分层架构、六边形架构、CQRS架构模式解读
DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型.在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式. ...
- 认知篇:CQRS 架构模式的本质
作者:京东科技 倪新明 CQRS只是一种非常简单的模式(pattern),CQRS本身并不是一种架构风格,和最终一致性/消息/读写分离/事件溯源/DDD等没有必然的联系,它最大优势是给我们带来更多的架 ...
- 详解SOA五种基本架构模式
目前,面向服务的架构(SOA)已成为连接复杂服务系统的主要解决方案.虽然SOA的理论很容易理解,但要部署一个设计良好.真正实用的SOA系统却非常困难.本文试图通过解析SOA的模式,提供与架构相关的技术 ...
- ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...
- 谈一下关于CQRS架构如何实现高性能
CQRS架构简介 前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海量数据,避开资源争夺.对于这3点,我觉得很有道理.所以也想谈一下,CQRS架构 ...
- Ajax 和 XML: 五种常见 Ajax 模式
Asynchronous JavaScript + XML(Ajax)无疑是 2006 年最热门的技术术语,且有望在 2007 得到进一步发展.但是对您的应用程序来说它究竟有什么意义呢?Ajax 应用 ...
- 数据源架构模式之数据映射器
http://lobert.iteye.com/blog/2102312 前面分别介绍了数据源架构模式之表数据入口.数据源架构模式之行和数据入口数据源架构模式之活动记录,相较于这三种数据源架构模式,数 ...
最新文章
- Python 回溯算法
- python程序设计与应用教程鄂大伟_鄂大伟-从零进阶的Python教学与开发之路.pdf
- Linux 下 VuePress 的安装使用
- OpenCV: OpenCV人脸检测框可信度排序
- 由内省引出JavaBean的讲解
- 极速收藏!巨详细的分布式架构知识体系
- [BZOJ 3668UOJ #2][Noi2014]起床困难综合症(贪心)
- zbbz插件使用教程_zbbz坐标插件 cad坐标标注插件
- 校园网组网方案的设计
- Java 经纬度计算两个点的之间的距离工具类
- 为什么您的简历被拒绝-以及如何解决它
- 机器人课做的一个悬崖识别自动变向的一个小车
- 游戏经典题目之十字激光炮
- 线上应用遇到了oom killer
- 【2021笔记本选购指南】让你了解笔记本少走弯路(内存、硬盘、屏幕等参数解读)
- 6款换脸软件下载推荐!
- 全球五大违背力学的建筑背后的仿真计算与监测技术
- 最新emlog高仿小刀娱乐网修复版模板分享
- linux自动挂载fcoe存储,刀箱服务器上部署集群模式CloudOS挂载FCoE存储方法
- ros navigation 中的amcl编译和运行
热门文章
- 【学习体会】图像泊松融合
- 聚爆登进去显示服务器,《聚爆Implosion》首次大型更新 新模式“驾驶员系统”登场...
- 【逻辑题】是谁在说谎?
- “泻药,人在知乎,刚吃月饼”,众大V吃定制月饼后腹泻,知乎道歉
- go读取/下载文件(大文件分片处理)
- 2021-01-20 哈希表
- 滨江学院计算机专硕,南信大滨江学院(无锡校区)报到开学,新生2545人!你关心的都在这......
- 夜光带你走进 前端工程师(四十 jS )
- 随心所语之容器(C++ Container)
- Python基础培训(一)