架构设计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

目录
相关文章
|
4天前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
27 6
|
9天前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
15天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
在微服务架构的海洋中,API网关扮演着枢纽的角色。它不仅是客户端请求的接收者,也是各个微服务间通信的协调者。本文将深入探讨API网关的设计原则、实现策略以及它在微服务生态中的重要性。我们将通过实际案例分析,了解API网关如何优化系统性能、提高安全性和简化客户端与服务的交互。
31 4
|
20天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构的复杂网络中,API网关扮演着交通枢纽的角色,不仅简化了客户端与各微服务的交互,还提升了系统的安全性和可维护性。本文将深入探讨API网关的设计原则、核心功能以及在实际应用中的部署策略,旨在为后端开发者提供一套完整的API网关解决方案。
|
17天前
|
运维 负载均衡 监控
探索微服务架构中的API网关模式
在当今分布式系统和微服务架构日益盛行的背景下,API网关作为一种重要的设计模式,承担着请求路由、负载均衡、认证授权、监控统计等关键职责。本文将深入探讨API网关在微服务架构中的作用,分析其实现机制,以及如何在实际应用中高效地部署和管理API网关,从而提升系统的可扩展性、安全性和可维护性。
20 2
|
20天前
|
监控 负载均衡 API
探索微服务架构中的API网关模式
在现代后端开发中,微服务架构因其灵活性和可扩展性而受到青睐。然而,随着服务的增多,如何有效管理和路由请求变得至关重要。API网关作为微服务架构中的一个关键组件,承担着请求转发、负载均衡和服务聚合等职责。本文将深入探讨API网关的设计原则、实现技术以及在实际应用中面临的挑战和解决方案。
|
12天前
|
消息中间件 前端开发 编译器
10种常见的软件架构模式简述
10种常见的软件架构模式简述
|
19天前
|
运维 Kubernetes Cloud Native
云原生技术浪潮下的微服务架构演进
在数字化转型的风潮中,云原生技术以其灵活性、可扩展性和弹性成为企业IT战略的核心。本文深入探讨了微服务架构如何借助云原生环境进行优化,并分析了容器化、服务网格等技术如何助力微服务更好地适应云原生生态。通过案例分析,我们揭示了微服务在现代云平台上的实践挑战与解决策略,同时对未来的技术趋势进行了预测。
36 0
|
2天前
|
监控 负载均衡 API
从单体到微服务:架构转型之道
【8月更文挑战第17天】从单体架构到微服务架构的转型是一项复杂而系统的工程,需要综合考虑技术、团队、文化等多个方面的因素。通过合理的规划和实施策略,可以克服转型过程中的挑战,实现系统架构的升级和优化。微服务架构以其高度的模块化、可扩展性和灵活性,为业务的持续发展和创新提供了坚实的技术保障。
|
11天前
|
Cloud Native 云计算 微服务
云原生时代:企业分布式应用架构的惊人蜕变,从SOA到微服务的大逃亡!
【8月更文挑战第8天】在云计算与容器技术推动下,企业分布式应用架构正经历从SOA到微服务再到云原生的深刻变革。SOA强调服务重用与组合,通过标准化接口实现服务解耦;微服务以细粒度划分服务,增强系统灵活性;云原生架构借助容器化与自动化技术简化部署与管理。每一步演进都为企业带来新的技术挑战与机遇。
38 6