【巨人的肩膀】CQRS架构

命令查询的责任分离 Command Query Responsibility Segregation (简称CQRS)模式是一种架构体系模式,能够使改变模型的状态的命令和模型状态的查询实现分离。这属于DDD应用领域的一个模式,主要解决 DDD 在数据库报表输出上处理方式

Greg Young 在 infoQ 的采访中 “State Transitions in Domain-Driven Design” 谈到了 CQRS,Greg 解释了把领域模型分为两种:状态校验,以及状态转换,维持当前状态的一个视图
在这里插入图片描述
在客户端就将数据的 CRUD 的新增修改删除 CUD 等操作和查询R进行分离,前者称为 Command,走 Command bus 进入 Domain 对模型进行操作,而查询则从另外一条路径直接使用 SQL 对数据进行操作,比如报表输出等,发挥 SQL 的特点

当一个 Command 进来时,从仓储 Repository 加载一个聚合 aggregate 对象群,然后执行其方法和行为。这样,会激发聚合对象群产生一个事件,这个事件可以分发给仓储 Repository,或者分发给 Event Bus 事件总线,比如 JavaEE 的消息总线等等。事件总线将再次激活所有监听本事件的处理者。当然一些处理者会执行其他聚合对象群的操作,包括数据库的更新

下图是开源 JiveJdon 的 CQRS 图:
在这里插入图片描述
在 JiveJdon 中,查询数据库是使用缓存,而写入数据库使用普通 MySQL,两者之间数据同步通过领域事件实现最终一致性

查询与写入数据库的分离,可以实现专门为各自查询、读取而设计特别的数据表结构,专门为查询进行优化

如果采取事件溯源 EventSourcing,保存记录的不是聚合当前状态,而是导致状态变化的事件日志 ,那么可以回放,从而找到重要状态改变的轨迹与原因,这是从事件日志追溯来源

虽然这种架构有些复杂,但是好处却很多,主要的是实现透明的分布式处理 Transparent distributed processing,当使用事件作为状态改变的引擎时,你可以通过实现多任务并发处理,比如通 JVM 并行计算或事件消息总线机制,事件能够很容易序列化,并在多个服务器之间传送。而查询操作则专门优化

  • 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、付费专栏及课程。

余额充值