架构设计30-架构模式07-命令查询指责分离模式

简介: 架构设计30-架构模式07-命令查询指责分离模式

架构设计系列文章,请参见连接。

介绍

命令查询责任分离源于Bertrand Mayer设计的命令查询分离(CQS)原理。CQS声明一个类只能有两种方法:改变状态并返回void的方法和返回状态但不改变它的方法。后来经过Greg Young的发展与推广最终形成了现在的CQRS。

讲解

命令查询的责任分离(Command Query Responsibility Segregation,简称CQRS)模式包含着两部分:能够使改变模型的状态的命令和模型状态的查询。CQRS是DDD应用领域的一个模式,主要解决DDD在数据库报表输出上处理方式。

在DDD架构中,通常会将查询和命令操作分开,具体落地时,是否将查询和命令分开成为两个项目可以视情况而定,大多数情况下放在一个项目可以提高业务内聚性。也可以在逻辑层面上划分为两个不同的操作模型(Command和Query)但是在物理层面上还是使用同一个数据库进行。

对于CQRS来说最主要的是改变状态和获取状态的两类操作,只要将这两类动作分离的都可以称作是CQRS。这样拆离之后对于查询DTO和命令DTO就也可以分离出来。大多数时候,改变状态所需的数据在形式或数量上都不同于用户需要查询所需的数据。使用相同的模型来一起处理查询和命令会会导致模型膨胀,只依靠一种类型来操作所需的所有东西,模型复杂性也会增加,聚合大小通常会更大。

模式描述

对于命令查询职责分离模式可以有两种变种模式:CQRS,CQRS/ES。CQRS是对命令和查询使用不同的服务器。而CQRS/ES是使用溯源事件的方式将用户命令发送到读数据库中。Event Sourcing是由Martin Fowler提出,是将业务领域精髓(尤其是最复杂的)与技术平台的复杂性实现脱钩的天作之合。为什么要用Event Sourcing?Domain Events – 救世主
CQRS

在这两种模式的选择中也分为有两个阵营:一个说你应该总是使用CQRS / ES,另一个说你应该只使用你的解决方案的一部分,并且只有当你需要具有高性能/可用性/可扩展性系统的高度并发系统时。您应该始终根据您的要求评估您的选择。

CQRS使我们能够使用不同的模型来改变状态和不同的模型来支持查询。通常写操作的频率低于读操作。 具有单独的模型和分离的数据库引擎允许我们独立地扩展查询端并更好地处理并发访问,因为读取端不再堵塞写入或命令端(在相反的情况下)。

对于读写数据库数据结构不一致或纯粹不一致的数据库的情况下,可以通过Event Sourcing的方式进行支撑。并且Event Sourcing的方式还可以进行消息记录。

特点

  • 开发

  • 过程管理(康威定律)

CQRS/ES增加了平台的复杂度。需要在实施过程中以过程的方法解决复杂度增加造成的问题。

  • 可测试性

CQRS/ES的测试点较多。并且因为复杂的增加可能会造成测试过程中问题反复。

  • 可扩展性

CQRS/ES最主要的目标就是为了高性能/可用性/可扩展性系统而设计的。所以对于可扩展性的支持较好。

  • 运维

  • 可伸缩

CQRS/ES最主要的目标就是为了高性能/可用性/可扩展性系统而设计的。所以对于可伸缩性的支持较好。

  • 部署难易

CQRS/ES系统中涉及到多服务部署的问题,需要在上线时进行配置。

  • 维护难易

稳定性尚可,但是可跟踪性比较弱。所以维护难度比较高。

  • 性能

CQRS/ES最主要的目标就是为了高性能/可用性/可扩展性系统而设计的。所以对于性能的支持较好。

总结:

在互联网高并发的情况下经常使用CQRS架构作为整体架构,然后再在CQRS内部使用其他的架构模式配合形成一套完整的架构。帮我们解决了很多关于性能、稳定性、数据拆分的问题。对于CQRS的特点可以总结为将用户操作与页面展示分离,可以使用静态化、缓存的方式解决读速度的问题。所以在CQRS中并没有限制在系统中使用同构数据库/数据源作为数据存储与查询做管理。在结合Event Sourcing的方式进行数据的更新操作。可以满足系统大量查询的情况。

参考

CQRS
领域驱动设计模式、原理与实践
CQRS架构
解决CQRS中的复杂问题
最全面的CQRS和事件溯源介绍 - Software House ASC

目录
相关文章
|
12月前
|
存储 数据挖掘 BI
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
波司登集团升级大数据架构,采用阿里云数据库 SelectDB 版,实现资源隔离与弹性扩缩容,查询性能提升 2-5 倍,总体成本降低 30% 以上,效率提升 30%,助力销售旺季高效运营。
703 9
|
10月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
618 0
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
1452 69
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
650 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
运维 供应链 前端开发
中小医院云HIS系统源码,系统融合HIS与EMR功能,采用B/S架构与SaaS模式,快速交付并简化运维
这是一套专为中小医院和乡镇卫生院设计的云HIS系统源码,基于云端部署,采用B/S架构与SaaS模式,快速交付并简化运维。系统融合HIS与EMR功能,涵盖门诊挂号、预约管理、一体化电子病历、医生护士工作站、收费财务、药品进销存及统计分析等模块。技术栈包括前端Angular+Nginx,后端Java+Spring系列框架,数据库使用MySQL+MyCat。该系统实现患者管理、医嘱处理、费用结算、药品管控等核心业务全流程数字化,助力医疗机构提升效率和服务质量。
911 4
|
消息中间件 人工智能 数据可视化
文生图架构设计原来如此简单之用户界面架构
节点式界面是文生图工具中一种强大而灵活的设计范式,以 ComfyUI 为代表。这种设计将复杂的图像生成过程分解为可视化的模块化组件,使用户能够精确控制生成流程的每个环节。
729 2
|
Java 网络安全 开发工具
Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
通过本文,读者可以深入了解Git的核心概念和实际操作技巧,提升版本管理能力。
|
存储 消息中间件 小程序
转转平台IM系统架构设计与实践(一):整体架构设计
本文描述了转转IM为整个平台提供的支撑能力,给出了系统的整体架构设计,分析了系统架构的特性。
638 10