什么是领域驱动设计中的 CQRS 模式?

本文介绍了领域驱动设计(DDD)中的CQRS模式,通过区分命令和查询操作,优化系统性能,处理事务和查询模型挑战。CQRS在大型业务中有助于清晰定义领域模型与数据模型的界限,提高系统灵活性。
摘要由CSDN通过智能技术生成

领域驱动设计(DDD)中的CQRS模式是一种架构模式,它将系统中的操作分为两类:命令(Command)与查询(Query)。CQRS 模式强调了应用程序要将命令和查询愤慨处理。
● 命令是对会引起数据发生变化的操作的总称,如新增、更新、删除等操作。命令通常是不返回数据的,它们只用于触发状态变化。
● 查询则是对不会对数据产生变化的操作的总称,例如按照某些条件查找数据。它们用于获取系统状态的快照或特定信息。查询通常返回数据给客户端
在CQRS模式中,命令和查询应在两个独立的系统中处理,这两个系统一般是指两个独立部署的应用程序,在某些特殊情况下,也可以部署在同一个应用内的不同接口上。通过分离职责、使用不同的数据存储和事件驱动的方式,允许更好地满足系统的性能和可伸缩性需求。
在使用CQRS模式时,通常也需要面临一些问题,例如事务和查询模型的设计。在事务方面,由于命令和查询分别在不同的系统中处理,因此需要解决时间差问题以及更新操作失败可能导致的数据不一致性问题。在查询模型设计方面,需要解决查询接口过多的问题,可以将属于同一领域的查询集中管理作为整个查询系统的一个上下文,或者将它们独立出来作为一个微服务。
总之,在DDD中,CQRS模式可以将领域模型与查询功能进行分离,使一些复杂的查询摆脱领域模型的限制,以更为简单的DTO形式展现查询结果。同时也可以分离不同的数据存储结构,使开发者更加自由地选择数据存储引擎。虽然引入CQRS模式会引入额外的复杂性和技能要求,但在面对大型业务系统和复杂的业务流程时,使用CQRS模式可以帮助将命令和查询进行拆分,使领域模型与数据模型的边界更加清晰。

CQRS(Command Query Responsibility Segration)架构,大家应该不会陌生了。简单的说,就是一个系统,从架构上把它拆分为两部分:命令处理(写请求)+查询处理(读请求)。然后读写两边可以用不同的架构实现,以实现CQ两端(即Command Side,简称C端;Query Side,简称Q端)的分别优化。CQRS作为一个读写分离思想的架构,在数据存储方面,没有做过多的约束。所以,我觉得CQRS可以有不同层次的实现,比如: 1.CQ两端数据库共享,CQ两端只是在上层代码上分离;这种做法,带来的好处是可以让我们的代码读写分离,更好维护,且没有CQ两端的数据一致性问题,因为是共享一个数据库的。我个人认为,这种架构很实用,既兼顾了数据的强一致性,又能让代码好维护。 2.CQ两端数据库和上层代码都分离,然后Q的数据由C端同步过来,一般是通过Domain Event进行同步。同步方式有两种,同步或异步,如果需要CQ两端的强一致性,则需要用同步;如果能接受CQ两端数据的最终一致性,则可以使用异步。采用这种方式的架构,个人觉得,C端应该采用Event Sourcing(简称ES)模式才有意义,否则就是自己给自己找麻烦。因为这样做你会发现会出现冗余数据,同样的数据,在C端的db有,而在Q端的db也有。和上面第一种做法相比,我想不到什么好处。而采用ES,则所有C端的最新数据全部用Domain Event表达即可;而要查询显示用的数据,则从Q端的ReadDB(关系型数据库)查询即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月球程序猿

你的鼓励将是我创作的最大动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值