您好,欢迎访问专业IT管理知识分享平台

上传文档

当前位置:首页 > 文章列表 > 3种CQRS架构模式

「技术架构」3种CQRS架构模式

3种CQRS架构模式

IT架构师联盟

 


微信图片_20201113145507.jpg

命令/查询分离(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,我也选择这个命名。


微信图片_20201113145600.png

单数据库CQRS


顾名思义,双方都在和一个数据库对话。Command 在域中执行用例,从而修改实体的状态,然后通过 ORM 如 Entity Framework Core 或 Hibernate 将实体保存到数据库中。


Query 直接通过数据访问层执行,数据访问层要么是使用各种 ORM,要么通过存储过程。


双数据库 CQRS

在“双数据库”方式中,我们需要两个数据库,一个用于写操作,一个用于读操作。命令端使用针对写操作优化的数据库。查询端使用针对读取操作优化的数据库。
微信图片_20201113145626.jpg


双数据库CQRS

命令每改变一个状态,修改后的数据就必须从写数据库推送到读数据库中,或者作为一个跨两个数据库的分布式事务,或者使用最终一致性模型


这种架构给软件的查询端带来了数量级的性能提升,这是有利的,因为一般系统在读数据上花费的时间一般比写数据要更多。


事件源 (Event source) CQRS

最后一种是最复杂的 CQRS 架构。与前面两种方式相比,事件源存储数据的思路完全不同。


在事件源方法中,我们并不只存储实体的当前状态,而且将实体发生的每一个状态作为快照来存储。实体并不是以标准化数据的形式保存,而是通过事件的时间戳来保存它们的变更。

微信图片_20201113145644.jpg

事件源CQRS

事件源带有以下好处:


  • 事件存储包括完整的审计跟踪,可以在需要严格监管的场景中派上用场。

  • 可以在任何时间点重建任何实体的任何状态,这对于调试非常有用。

  • 可以重放事件,查看系统中任何时候到底发生了什么。这个功能对于压力测试和 bug 修复非常有用。

  • 可以轻松地重建生产数据库。

  • 有多个为读优化的数据存储。


但在另一方面,这种方式实现很复杂,如果你不能从其中受益,那么用这个模式可能适得其反。


小结

CQRS 真正的威力在于可以对写和读操作进行不同的优化。但在另一方面,系统会变得更加复杂,命令端和查询端代码不完全一致。并且由于存在多个数据库,管理更复杂,需要更繁琐的 ORM 映射。
更多推荐
电商系统中微服务体系中的分层设计和领域划分
SOA服务架构规划-从方法论到实践分享
微服务连载(二)漫谈何时从单体架构迁移到微服务?
微服务连载(一)微服务技术体系和六大组件
解读架构师的核心工作内容
云原生架构-企业技术变迁的趋势分析


微信图片_20201113145702.png


“阅读原文”海量文档免费阅读下载



阅读原文

暂时没有评论,评论一个吧?

您需要登录后才能评论 , 去登录

发表文章

Powered by DS文库

Copyright © 专业IT管理知识分享平台 All Rights Reserved. 鄂ICP备19005274号-1
×
保存成功