简述3种CQRS架构模式

关注点分离是一种有效整理架构思想的技巧,你应当把注意力集中在一个方面。

Edsger W. Dijkstra

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

想知道更多?描下面的二维码关注我

后台回复"技术",加入技术群

【精彩推荐】

点个赞+在看,少个 bug ????

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CQRS(Command Query Responsibility Segregation)是一架构模式,用于分离应用程序的读取和写入操作。它的基本概念是将应用程序的命令(Command)和查询(Query)分开处理,分别使用不同的模型进行处理。 在CQRS架构中,写操作使用命令模型(Command Model),负责处理应用程序的状态更新和业务逻辑。而读操作使用查询模型(Query Model),负责处理应用程序的数据查询和读取操作。这两个模型可以根据各自的需求进行优化和设计。 CQRS架构的主要目标是解决传统的CRUD(Create, Read, Update, Delete)模式在复杂领域中的不足。它可以带来以下好处: 1. 灵活性:CQRS允许读写操作使用不同的模型,可以针对每个操作类型进行优化,提高性能和可扩展性。 2. 扩展性:由于读写操作分离,可以根据需求独立扩展读和写的部分,避免了单一数据模型的性能瓶颈。 3. 高效性:通过针对特定查询进行优化,可以提高查询性能,满足更高的并发需求。 4. 松耦合:读写操作分离降低了系统各部分之间的耦合度,使得系统更易于维护和演化。 CQRS架构适用于一些场景,如: 1. 高并发读写:当应用程序需要处理大量的读写操作,并需要高性能和可扩展性时,CQRS可以将读写操作分离,并针对每个操作进行优化。 2. 复杂领域逻辑:当应用程序的业务逻辑非常复杂,并且读写操作之间存在较大的差异时,CQRS可以更好地组织和管理业务逻辑。 3. 实时报表和分析:当应用程序需要提供实时的报表和分析功能时,CQRS可以通过优化查询模型提供更好的性能和用户体验。 需要注意的是,CQRS架构增加了系统的复杂性,适用于复杂度较高的场景,对于简单的应用程序可能带来不必要的开销。因此,在选择采用CQRS架构时需要权衡利弊并结合实际需求进行决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值