命令/查询分离(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 映射。

文中链接:

  1. clean architecture https://www.pluralsight.com/courses/clean-architecture-patterns-practices-principles

  2. Command-query separation https://en.wikipedia.org/wiki/Command%E2%80%93query_separation

  3. Martin Fowler’s 谈 CQS https://martinfowler.com/bliki/CommandQuerySeparation.html

  4. 分离点关注1 https://en.wikipedia.org/wiki/Separation_of_concerns

  5. 分离点关注2 https://www.goodreads.com/quotes/tag/separation-of-concerns

  6. 最终一致性 https://theacetechnologist.com/post/eventually-consistent-architecture-pattern/

英文原文:

https://levelup.gitconnected.com/3-cqrs-architectures-that-every-software-architect-should-know-a7f69aae8b6c

3种CQRS架构模式相关推荐

  1. 简述3种CQRS架构模式

    简述3种CQRS架构模式_朱小厮的博客-CSDN博客 团队开发框架实战-CQRS架构 - 简书 关注点分离是一种有效整理架构思想的技巧,你应当把注意力集中在一个方面. Edsger W. Dijkst ...

  2. 详解 CQRS 架构模式

    从一开始,软件系统就被用于各种用途,针对它们的需求也随着时间的推移而增长.需求的变更可能与业务逻辑.伸缩性或系统的其他方面有关. 为了满足这些相互矛盾或重叠的需求,工程师必须在设计系统时做出各种各样的 ...

  3. 分层架构、六边形架构、CQRS架构模式解读

    DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型.在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式. ...

  4. 认知篇:CQRS 架构模式的本质

    作者:京东科技 倪新明 CQRS只是一种非常简单的模式(pattern),CQRS本身并不是一种架构风格,和最终一致性/消息/读写分离/事件溯源/DDD等没有必然的联系,它最大优势是给我们带来更多的架 ...

  5. 详解SOA五种基本架构模式

    目前,面向服务的架构(SOA)已成为连接复杂服务系统的主要解决方案.虽然SOA的理论很容易理解,但要部署一个设计良好.真正实用的SOA系统却非常困难.本文试图通过解析SOA的模式,提供与架构相关的技术 ...

  6. ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现

    在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...

  7. 谈一下关于CQRS架构如何实现高性能

    CQRS架构简介 前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海量数据,避开资源争夺.对于这3点,我觉得很有道理.所以也想谈一下,CQRS架构 ...

  8. Ajax 和 XML: 五种常见 Ajax 模式

    Asynchronous JavaScript + XML(Ajax)无疑是 2006 年最热门的技术术语,且有望在 2007 得到进一步发展.但是对您的应用程序来说它究竟有什么意义呢?Ajax 应用 ...

  9. 数据源架构模式之数据映射器

    http://lobert.iteye.com/blog/2102312 前面分别介绍了数据源架构模式之表数据入口.数据源架构模式之行和数据入口数据源架构模式之活动记录,相较于这三种数据源架构模式,数 ...

最新文章

  1. Python 回溯算法
  2. python程序设计与应用教程鄂大伟_鄂大伟-从零进阶的Python教学与开发之路.pdf
  3. Linux 下 VuePress 的安装使用
  4. OpenCV: OpenCV人脸检测框可信度排序
  5. 由内省引出JavaBean的讲解
  6. 极速收藏!巨详细的分布式架构知识体系
  7. [BZOJ 3668UOJ #2][Noi2014]起床困难综合症(贪心)
  8. zbbz插件使用教程_zbbz坐标插件 cad坐标标注插件
  9. 校园网组网方案的设计
  10. Java 经纬度计算两个点的之间的距离工具类
  11. 为什么您的简历被拒绝-以及如何解决它
  12. 机器人课做的一个悬崖识别自动变向的一个小车
  13. 游戏经典题目之十字激光炮
  14. 线上应用遇到了oom killer
  15. 【2021笔记本选购指南】让你了解笔记本少走弯路(内存、硬盘、屏幕等参数解读)
  16. 6款换脸软件下载推荐!
  17. 全球五大违背力学的建筑背后的仿真计算与监测技术
  18. 最新emlog高仿小刀娱乐网修复版模板分享
  19. linux自动挂载fcoe存储,刀箱服务器上部署集群模式CloudOS挂载FCoE存储方法
  20. ros navigation 中的amcl编译和运行

热门文章

  1. 【学习体会】图像泊松融合
  2. 聚爆登进去显示服务器,《聚爆Implosion》首次大型更新 新模式“驾驶员系统”登场...
  3. 【逻辑题】是谁在说谎?
  4. “泻药,人在知乎,刚吃月饼”,众大V吃定制月饼后腹泻,知乎道歉
  5. go读取/下载文件(大文件分片处理)
  6. 2021-01-20 哈希表
  7. 滨江学院计算机专硕,南信大滨江学院(无锡校区)报到开学,新生2545人!你关心的都在这......
  8. 夜光带你走进 前端工程师(四十 jS )
  9. 随心所语之容器(C++ Container)
  10. Python基础培训(一)