命令查询的责任分离Command Query Responsibility Segregation (简称CQRS)模式是一种架构体系模式,能够使改变模型的状态的命令和模型状态的查询实现分离。这属于DDD应用领域的一个模式,主要解决DDD在数据 库报表输出上处理方式。
Greg Young在infoQ的采访中“State Transitions in Domain-Driven Design”谈到了CQRS,Greg 解释了把领域模型分为两种:状态校验,以及状态转换,维持当前状态的一个视图。
在客户端就将数据的新增修改删除等动作和查询进行分离,前者称为Command,走Command bus进入Domain对模型进行操作,而查询则从另外一条路径直接对数据进行操作,比如报表输出等。
当一个Command进来时,从仓储Repository加载一个聚合aggregate对象群,然后执 行其方法和行为。这样,会激发聚合对象群产生一个事件,这个事件可以分发给仓储Repository,或者分发给Event Bus事件总线,比如JavaEE的消息总线等等。事件总线将再次激活所有监听本事件的处理者。当然一些处理者会执行其他聚合对象群的操作,包括数据库的 更新。
因为领域对象操作和数据库保存持久这两个动作分离,因此,数据表结构可以和领域对象松耦合(JiveJdon源码可展示领域对象和数据表不再是一对一对应依赖,这也是使用Hibernate 等ORM框架容易造成的问题),你可以优化数据表结构专门用于查询。
再者,由于事件驱动了领域模型的状态改变,如果你记录这些事件audit ,将可以将一些用户操作进行回放,从而找到重要状态改变的轨迹,而不是单纯只能依靠数据表字段显示当前状态,至于这些当前状态怎么来的,你无法得知。当你 从数据库中获得聚合体时,可以将相关的事件也取出来,这些叫Event Sourcing,事件源虽然没有何时何地发生,但是可以清楚说明用户操作的意图。
虽然这种架构有些复杂,但是好处却很多,主要的是实现透明的分布式处理Transparent distributed processing,当使用事件作为状态改变的引擎时,你可以通过实现多任务并发处理,比如通过JVM并行计算或事件消息总线机制,事件能够很容易序列 化,并在多个服务器之间传送,(EJB提倡贫血失血模型,实际就是为解决胖模型在多个服务器之间传送时序列化耗费性能,现在我们不序列化模型,而是改变模 型数据的事件)。
领域事件和EventSourcing
你的SOA已经使用了EDA和CQRS吗?
Jdon分析法
Jdon框架CQRS入门
DDD CQRS和Event Sourcing的案例:足球比赛
使用CQRS重新考虑架构
使用TRIMM 为EA项目产生基于Axon的CQRS代码
Go 1.5的并发特性与案例(事件与转账)
日志是每个软件工程师关心的统一数据抽象
依赖注入与事件编程
CQS问题?
DDD DCI和领域事件
Martin Fowler推荐的事件源Event Sourcing 架构:LMAX架构
Event Sourcing
设计模式之State
设计模式之Observer
DDD CQRS架构和传统架构的优缺点比较
Lagom是一个集成ES/CQRS的Reactive微服务框架
相关专题:
CQRS专题
Actor模型专辑
DDD领域驱动设计
EDA专题
http://www.jdon.com/cqrs.html
相关推荐
magic-bottle项目是一套匿名社交系统,包括Andriod、WEB管理端以及服务端,采用DDD+CQRS架构 magic-bottle项目是一套匿名社交系统,包括Andriod、WEB管理端以及服务端,采用DDD+CQRS架构 magic-bottle项目是一套...
**CQRS架构实例** CQRS(Command Query Responsibility Segregation,命令查询职责分离)是一种软件设计模式,它将读取操作和写入操作分离,旨在提高系统的可读性、可维护性和性能。CQRS的核心思想是将一个应用程序...
在CQRS架构中,读模型和写模型可以独立优化,读模型用于高效检索数据,而写模型负责处理业务逻辑和更新数据。这种分离使得系统更加灵活,可以适应不同的性能需求。 现代响应式微服务架构进一步扩展了这些概念。响应...
基于领域驱动设计与CQRS架构实现。源码+文档+全部资料+优秀项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才...
### CQRS学习指南:如何实现CQRS架构 #### 一、CQRS简介 CQRS(Command Query Responsibility Segregation)是一种软件架构模式,它提倡将系统的命令(修改数据)与查询(读取数据)职责分离。这种模式对于构建...
模拟最终用户添加收入或费用交易的银行帐户方案,并在异步事件源和CQRS架构中对其进行处理以重新计算用户的银行帐户余额。 用户还可以请求其帐户余额。 在这里,您可以看到设计: 部署外部服务 docker-compose up -d...
【CQRS架构】是一种设计模式,它将应用程序的读取和写入操作分离到不同的模型中。在CQRS架构中,命令处理写操作,而查询处理读操作。这种分离有助于提高系统的性能和可读性,因为读和写可以独立优化。例如,写模型...
Emerald +微服务模板使用CQRS架构的Django GRPC框架服务堆栈:Django GRPS框架,Kafka,MySQL,Redis要求Python(3.6、3.7、3.8) Django(2.2,3.0),Django REST Framework(3.10.x,3.11.x) RHEL 8.3,Fedora ...
的Sourcerer是使用事件采购在Java中8实施CQRS架构的自以为是,功能,和存储不可知框架。 Sourcerer固执己见 Sourcerer是一个框架,它支持CQRS / ES架构中使用的一组核心概念,并且对这些构建基块是什么以及如何实现...
使用CQRS架构,提升消息并发处理能力; 完全开源,并提供ios、andriod客户端源码,可直接商用; DDD真正落地的开源项目; 提供完整的匿名社交解决方案; 部署方便,支持分布式; 系统功能 从业务功能上,目前主要有...
具有CQRS架构的Todolist应用程序。 用建设。 演示版 请访问。 管理面板和待办事项历史记录快照 markov链摘要 安装 克隆此模块,然后将服务器指向/ public。 运行composer install来下载依赖项。 要生成数据库,...
CQRS-NServiceBus-EventStore-ElasticSearch 展示使用 NServiceBus EventStore 和 ElasticSearch 的 CQRS 架构的原型。 更多信息在我的博客:
趁着这几天不算很忙,我抽空将其又翻译回中文,并加入更多的批准内容,供爱好DDD、CQRS和架构设计的朋友阅读参考,也希望大家能够积极参加讨论。Apworks是一套应用程序开发框架,软件架构师和开发人员可以使用这套...
CQRS架构通常包含以下组件: 1. **写模型(Write Model)**:负责处理所有对数据的修改,如添加、删除或更新操作。这些操作通常以命令(Command)的形式触发,命令包含了执行动作的信息。 2. **读模型(Read Model...