CQRS Design Pattern in Microservices - CQRS模式

news2025/4/6 0:51:53

原文链接 CQRS Design Pattern in Microservices - GeeksforGeeks

【文章看起来像是AI写的。。。  😂😂😂】

简介

实现步骤

1,识别有界上下文:(Identify Bounded Contexts:)

2,命令和查询路径分离(Separate Command and Query Paths)

3,实现命令服务(Implement Command Services:)

4,实现查询服务(Implement Query Services:)

5,定义APIs(Define APIs)

6,选择数据存储机制(Choose Data Storage Mechanisms:)

7,建立异步通信(Establish Asynchronous Communication:  )     

8,处理最终一致性(Handle Eventual Consistency:)

真实例子-在线书店(online bookstore)

1,命令服务(Command Services:)

2,查询服务(Query Services:)

3,事件驱动架构(Event-Driven Architecture:)

4,数据存储(Data Storage:)

5,API Gateway:

几个原则和概念

服务边界(Service Boundary):

关注点分离 (Separation of Concerns):

独立扩展 (Independent Scaling)

Domain-Driven Design (DDD)领域驱动设计 (Domain-Driven Design (DDD)):

Event-Driven Architecture:事件驱动的体系结构 (Event-Driven Architecture:)

关注点分离  (Separation of Concerns of CQRS )

命令职责(Command Responsibility)

写操作(Write Operations)

验证和业务逻辑:(Validation and Business Logic:)

事务行为:(Transactional Behavior)

查询职责(Query Responsibility)

读取操作(Read Operations)

优化的数据检索:(Optimized Data Retrieval)

可伸缩性:(Scalability)

沟通协调:(Communication and Coordination)

命令-查询分离:(Command-Query Separation)

异步通信:(Asynchronous Communication)

最终一致性:(Eventual Consistency)

Domain建模:(Domain Modeling)

Domain-Driven Design (DDD):

有界上下文(Bounded Contexts)

主要组件(Key Components of CQRS)

命令服务:(Command Service:)

命令处理程序:(Command Handlers:)

领域逻辑:(Domain Logic: )

事务行为:(Transactional Behavior):

查询服务(Query Service:)

查询处理(Query Handlers: )

 优化的数据访问:(Optimized Data Access: )

可伸缩性:(Scalability: )

Event Bus or Message Broker:

异步通信:(Asynchronous Communication:)

发布-订阅机制:(Publish-Subscribe Mechanism:)

解耦:(Decoupling: )

数据存储(Data Stores:)

写存储(命令侧):(Write Store (Command Side):)

Read Store(查询端):(Read Store (Query Side):)

API Gateway or Service Mesh:

入口点:(Entry Point: )

路由和负载平衡:(Routing and Load Balancing: )

安全和身份验证:(Security and Authentication: )

优势(Advantages of CQRS)

扩展性(Scalability:)

性能优化(Performance Optimization:)

灵活性和可维护性 (Flexibility and Maintainability:)

改进的性能和响应能力 (Improved Performance and Responsiveness:)

挑战(Challenges of CQRS)

提升了复杂性(Increased Complexity:)

一致性管理(Consistency Management:)

数据同步:(Data Synchronization:)

操作开销: (Operational Overhead:)


简介

CQRS( Command Query Responsibility Segregation )意思就是 把 处理命令(command)的职责 和 查询数据(Query)的职责 分离开(Segregation)。

实现步骤

1,识别有界上下文:(Identify Bounded Contexts:)

        在应用不同规则和定义的域中定义有界上下文。每个有界上下文可能对应于体系结构中的微服务边界。

2,命令和查询路径分离(Separate Command and Query Paths)

        指定特定的微服务来处理命令(写操作),其他微服务来处理查询(读操作)。确保这两条路径之间的关注点清晰分离。

3,实现命令服务(Implement Command Services:)

        创建负责处理命令的微服务。这些服务接收命令请求,验证它们,执行必要的操作来更改系统的状态,并发布表示状态更改的事件。

4,实现查询服务(Implement Query Services:)

        开发专门处理查询的微服务。这些服务响应读请求从系统中检索数据,确保有效的数据访问和优化读操作。

5,定义APIs(Define APIs)

        为命令和查询服务设计清晰一致的API,指定它们支持的操作类型以及它们接受和返回的数据格式。

6,选择数据存储机制(Choose Data Storage Mechanisms:)

        根据命令和查询服务的具体需求,为其选择合适的数据存储机制。例如,命令业务可能使用针对写操作优化的NoSQL数据库,而查询业务可能使用关系数据库进行复杂的查询。

7,建立异步通信(Establish Asynchronous Communication:  )     

        在命令和查询服务之间实现异步通信机制(如 message brokers 或 event buses)。这允许命令服务发布表示状态变化的事件,查询服务可以订阅这些事件以获得最终的一致性。

8,处理最终一致性(Handle Eventual Consistency:)

        开发机制来处理命令和查询服务之间的最终一致性。这可能涉及实现协调流程(reconciliation processes)、补偿事务(compensating transactions),或者使用事件重放(event replay)等技术来保持一致性。

真实例子-在线书店(online bookstore)

1,命令服务(Command Services:)

        订单服务(Order Service:)负责处理与订单管理相关的命令。命令包括创建新订单、更新订单状态和处理付款。该服务确保订单在数据库中得到验证、处理和持久化。

        库存服务(Inventory Service:)负责管理与库存管理相关的命令。命令包括增加或减少图书库存、更新产品可用性和处理缺货。此服务确保库存变化准确地反映在系统中,并相应地更新库存水平。

2,查询服务(Query Services:)

        商品目录服务(Product Catalog Service:)负责处理与产品目录相关的查询。查询包括检索图书信息、按标题或作者搜索图书以及列出可用产品。该服务提供对产品数据的快速有效访问,以便在网站或移动应用程序上显示。

        订单历史服务(Order History Service: )负责处理与订单历史记录和客户资料相关的查询。查询包括检索订单详细信息、查看订单历史记录和管理用户配置文件。此服务为客户提供访问其过去订单的权限,并允许他们跟踪订单状态。

3,事件驱动架构(Event-Driven Architecture:)

        Event Bus: 事件用于在命令和查询服务之间通信更改。当下了一个新订单(命令)时,将发布一个事件,指示订单的创建。查询服务订阅相关事件并相应地更新其读取模型,从而确保命令端和查询端之间的最终一致性。

4,数据存储(Data Storage:)

        写入存储(Write Store (Command Side): )使用为写操作优化的数据库,如关系数据库或NoSQL数据库。命令服务存储与订单、库存变更和其他写操作相关的数据。
 

        读取存储(Read Store (Query Side):)使用单独的数据库进行读操作优化。查询服务维护数据的非规范化视图或投影(projections),以提高查询性能。

5,API Gateway:

        Entry Point: API网关充当客户机应用程序与微服务体系结构交互的入口点。
它根据正在执行的操作将请求路由到适当的命令或查询服务。

几个原则和概念

服务边界(Service Boundary):

        每个微服务都围绕特定的业务功能或领域定义了一个清晰的边界。该边界封装了与该域相关的命令(command)和查询(query)职责。

关注点分离 (Separation of Concerns):

        CQRS强调分离处理命令(commands)(写操作)和处理查询(queries)(读操作)的职责。每个微服务要么专注于处理命令,要么专注于处理查询,但不是两者都做。

独立扩展 (Independent Scaling)

        由于命令和查询通常具有不同的性能特征和可伸缩性需求,CQRS允许微服务根据它们处理的工作负载独立扩展。例如,负责处理高频(high-frequency)命令的微服务可以独立于处理复杂查询的微服务进行扩展。

Domain-Driven Design (DDD)领域驱动设计 (Domain-Driven Design (DDD)):

        CQRS通常与领域驱动设计原则一起应用。DDD有助于识别有界上下文(bounded contexts)、聚合(aggregates)和域实体(domain entities),然后可以按照CQRS模式将它们映射到微服务。

Event-Driven Architecture:事件驱动的体系结构 (Event-Driven Architecture:)

        事件驱动的体系结构通过支持微服务之间的通信和维护分布式系统之间的一致性来补充CQRS。事件可以用来通知其他微服务由于命令执行而导致的状态变化

关注点分离  (Separation of Concerns of CQRS )

命令职责(Command Responsibility)

写操作(Write Operations)

        负责处理命令的微服务专注于管理数据修改。它们接收执行更改系统状态的操作的请求,例如创建、更新或删除数据。

验证和业务逻辑:(Validation and Business Logic:)

        命令微服务执行业务规则并验证传入请求,以确保数据完整性和一致性。        

事务行为:(Transactional Behavior)

        命令通常在事务边界内执行,以保证原子性、一致性、隔离性和持久性(ACID属性)。
 

查询职责(Query Responsibility)

读取操作(Read Operations)

        用于处理查询的微服务专注于从系统中检索数据。它们在不改变系统状态的情况下响应信息请求。

优化的数据检索:(Optimized Data Retrieval)

        查询微服务优化数据存储和检索机制,以实现高效的读取操作。这可能涉及对数据进行非规范化、采用缓存策略或使用专门的查询语言。

可伸缩性:(Scalability)

        查询微服务可以根据读取工作负载独立伸缩,从而实现高效的资源分配和性能优化。
沟通协调:

沟通协调:(Communication and Coordination)

命令-查询分离:(Command-Query Separation)

        处理命令的微服务和处理查询的微服务之间存在明确的界限,防止重叠,并确保每个服务都有明确的职责。

异步通信:(Asynchronous Communication)

        命令和查询微服务可以异步通信,允许解耦交互和容错。异步消息传递系统或事件驱动的体系结构促进了服务之间的通信。

最终一致性:(Eventual Consistency)

        异步通信可以导致命令端和查询端之间的最终一致性。微服务必须优雅地处理最终的一致性场景,确保数据正确性并将用户影响降至最低。

Domain建模:(Domain Modeling)

Domain-Driven Design (DDD):

        微服务与DDD原则定义的领域边界保持一致。每个微服务封装了一个特定的领域或业务功能,确保了内聚行为和领域逻辑的封装。

有界上下文(Bounded Contexts)

        微服务在域中定义有界上下文,描绘(delineating)应用不同规则和定义的区域。这确保了复杂领域中关注点的清晰和分离。

主要组件(Key Components of CQRS)

命令服务:(Command Service:)

命令处理程序:(Command Handlers:)

        负责接收、验证和执行改变系统状态的命令。

领域逻辑:(Domain Logic: )

        实现处理命令所需的业务规则和特定于领域的逻辑。

事务行为:(Transactional Behavior):

        确保命令执行的原子性、一致性、隔离性和持久性(ACID属性)。

查询服务(Query Service:)

查询处理(Query Handlers: )

        查询处理程序:在不修改状态的情况下从系统响应读请求检索数据。

 优化的数据访问:(Optimized Data Access: )

       利用高效的数据检索机制,如反规范化、缓存或索引,来优化查询性能。

可伸缩性:(Scalability: )

        独立扩展以有效地处理不同的读工作负载。

Event Bus or Message Broker:

异步通信:(Asynchronous Communication:)

        命令服务和查询服务之间通过事件或消息进行通信。

发布-订阅机制:(Publish-Subscribe Mechanism:)

        允许命令服务发布表示状态变化的事件,查询服务可以订阅这些事件以获得最终的一致性。

解耦:(Decoupling: )

      支持服务之间的松耦合,提高灵活性和容错性。

数据存储(Data Stores:)

写存储(命令侧):(Write Store (Command Side):)

        针对处理写操作(如插入、更新和删除)进行了优化。可能使用NoSQL数据库提高可伸缩性和性能。

Read Store(查询端):(Read Store (Query Side):)

        优化了高效的数据检索。可以使用关系数据库进行复杂的查询,或者为特定的用例使用专门的数据存储。

API Gateway or Service Mesh:

入口点:(Entry Point: )

        为客户端提供与微服务架构交互的单一入口点。

路由和负载平衡:(Routing and Load Balancing: )

        将请求路由到适当的命令或查询服务,并在实例之间平衡负载。

安全和身份验证:(Security and Authentication: )

        执行安全策略、身份验证和授权机制。

优势(Advantages of CQRS)

扩展性(Scalability:)

        独立扩展(Independent Scaling:)命令和查询服务可以根据它们处理的工作负载独立扩展。这允许更好的资源分配和改进的性能,因为每个服务都可以针对其特定的职责进行优化。

性能优化(Performance Optimization:)

        优化的数据访问:(Optimized Data Access: )命令服务和查询服务可以使用针对各自操作优化的单独数据存储机制。例如,命令服务可能使用NoSQL数据库进行快速写操作,而查询服务可能使用关系数据库进行复杂查询。

        高效的读操作:(Efficient Read Operations: )查询服务可以对数据进行反规范化,使用缓存策略,或者使用专门的数据存储来优化读操作,提高响应时间。

        

灵活性和可维护性 (Flexibility and Maintainability:)

        关注点分离:(Separation of Concerns: CQRS)CQRS将处理命令(写操作)和处理查询(读操作)的职责分离开来。这种分离使得随着时间的推移更容易理解、维护和发展系统。

        模块化:(Modularity)CQRS体系结构中的每个微服务都封装了特定的业务功能或领域,这使得在不影响整个系统的情况下更容易更新或替换单个服务。

        

改进的性能和响应能力 (Improved Performance and Responsiveness:)

        减少阻塞操作:(Reduced Blocking Operations:)分离读和写操作可以减少争用和阻塞,从而提高响应能力和整体系统性能。

        异步通信:(Asynchronous Communication: CQRS)CQRS通常涉及服务之间的异步通信,这可以通过将命令执行与查询处理分离来提高响应性。

        

挑战(Challenges of CQRS)

提升了复杂性(Increased Complexity:)

       体系结构复杂性:(Architectural Complexity:)实现CQRS引入了额外的体系结构复杂性,包括需要单独的命令和查询路径、事件溯源和最终的一致性机制。

        开发复杂性:(Development Complexity:)为命令和查询服务开发和维护单独的代码库会增加开发开销,特别是对于不熟悉模式的团队。

一致性管理(Consistency Management:)

        最终一致性:(Eventual Consistency: )维护命令端和查询端之间的最终一致性可能具有挑战性,特别是在具有高并发性和数据复制延迟的分布式系统中。

        同步问题:(Synchronization Issues:)确保由命令传播的数据更新准确地反映在查询结果中,需要仔细的同步机制和对竞争条件的处理。

数据同步:(Data Synchronization:)

        数据复制:(Data Duplication: )CQRS通常涉及在命令和查询模型之间复制数据,从而增加了存储需求和保持数据同步的复杂性。

        数据完整性:(Data Integrity: )维护跨多个数据存储的数据完整性并确保它们之间的一致性可能具有挑战性,特别是在系统故障或网络分区期间。

操作开销: (Operational Overhead:)

       
        基础设施管理:(Infrastructure Management:)管理运行独立命令和查询服务所需的基础设施,包括部署、监视和扩展,可能会带来额外的操作开销。


         监视和调试:(Monitoring and Debugging:)调试和监视基于cqrs的微服务架构需要专门的工具和技术来跟踪命令和事件流并诊断一致性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

RPC远程服务调用详解和gRPC简介

RPC (Remote Procedure Call)是远程过程调用,比如说现在有两台服务器A, B,一个在A服务器上的应用想要调用B服务器上的应用提供的某个,由于不在两个方法不在一个内存空间,不能直接调用,需要通过网络表达调用的语义和传达…

计算机网络知识点全梳理(三.TCP知识点总结)

目录 TCP基本概念 为什么需要TCP 什么是TCP 什么是TCP链接 如何唯一确定一个 TCP 连接 TCP三次握手 握手流程 为什么是三次握手,而不是两次、四次 为什么客户端和服务端的初始序列号 ISN 不同 既然 IP 层会分片,为什么 TCP 层还需要 MSS TCP四…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…

前端成长之路:CSS元素显示模式

元素显示模式 网页中的标签非常的多,在不同的地方会使用到不同类型的标签,了解这些标签的特点可以更好的布局我们的网页。 元素显示模式就是元素(标签)按照什么方式进行显示,比如:div标签会自己独占一行&a…

如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量

简介 vnStat是一个免费的、开源的、基于控制台的Linux操作系统网络流量监控工具。通过vnStat,你可以在不同的时间段监控网络统计数据。它简单、轻量级,并且消耗的系统资源很小。vnStat允许你按小时、日、月、周和日生成网络流量数据。本教程将向你展示如…

解决pip下载慢

使用pip下载大量安装包,下载速度太慢了 1、问题现象 pip安装包速度太慢 2、解决方案 配置国内源 vi /root/.config/pip/pip.conf[global] timeout 6000 index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中,消息队列(Message Queue)是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理,支持多种消息传递模式。其中,Publish/Subscribe(发布/订阅&#xff0…

专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。

考研落幕,本人本中游211,如愿以偿考入浙江大学,专业课842信号系统与数字电路140,总分410,和考前多次模考预期差距不大(建议大家平时做好定期模考测试,直接从实战分数中,找到复习的脉…

Unity类银河战士恶魔城学习总结(P178 Archer s arrow 弓箭手的箭)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节制作了一个弓箭手的箭 Arrow_Controller.cs 1.OnTriggerEnter2D方法 功能:检测箭矢与其他对象的碰撞。逻辑&#xff1…

后端接受前端传递数组进行批量删除

问题描述:当我们需要做批量删除功能的时候,我们循环单次删除的接口也能进行批量删除,但要删除100条数据就要调用100次接口,或者执行100次sql,这样系统开销是比较大的,那么我们直接采用接收的数组格式数据sq…

ByteCTF2024

wp参考: 2024 ByteCTF wp 2024 ByteCTF WP- Nepnep ByteCTF 2024 writeup by Arr3stY0u 五冠王!ByteCTF 2024 初赛WriteUp By W&M ByteCTF 2024 By W&M - W&M Team ByteCTF Re WP - 吾爱破解 - 52pojie.cn 2024 ByteCTF - BediveRe_R…

Envoy 服务发现原理大揭秘与核心要点概述

1 Envoy动态配置介绍 动态资源,是指由envoy通过xDS协议发现所需要的各项配置的机制,相关的配置信息保存 于称之为管理服务器(Management Server )的主机上,经由xDS API向外暴露;下面是一个 纯动态资源的基…

转盘抽奖功能(附加代码)

写在开头 上期代码主要实现PC端电商网站商品放大效果,本期就来实现积分随机抽奖效果,开发久了很多功能都是通过框架组件库来完成,但是如果组件满足不了开发需求,还需要开发人员手动封装组件,专门出这样一期文章&#x…

【CSS in Depth 2 精译_075】12.2 Web 字体简介 + 12.3 谷歌字体的用法

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体 ✔️12.3 谷歌字体 ✔️12.…

ARM嵌入式学习--第七天(GPT)

GPT -介绍 GPT有一个32位向上计数器,定时计数器值可以使用外部引脚上的事件捕获到寄存器中,捕获触发器可以被编程为上升沿和下降沿。GPT还可以在输出比较引脚上生成事件,并在定时器达到编程值时产生中断。GPT有一个12位预分频器,…

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket(应用程序之间的通讯保障) 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1:ServerSocket和Socket有什么关系? ServerSocket Soc…

SpringBoot快速使用

一些名词的碎碎念: 1> 俩种网络应用设计模式 C/S 客户端/服务器 B/S 浏览器/服务器 俩者对比: 2> 集群和分布式的概念 集群: 分布式: 例子: 一个公司有一个人身兼多职 集群: 招聘N个和上面这个人一样身兼多职 分布式: 招聘N个人,分担上面这个人的工作,进行工作的拆分. 工…

【含开题报告+文档+PPT+源码】基于SpringBoot的开放实验管理平台设计与实现

开题报告 设计开放实验管理平台的目的在于促进科学研究与教学的融合。传统实验室常常局限于特定地点和时间,而开放平台可以为学生、教师和研究人员提供一个便捷的交流与共享环境。通过在线平台,他们可以分享实验资源、交流经验,从而促进科学…

分布式 漏桶算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 漏桶算法 & 总结》《分布式 & 漏桶算法 & 问题》 概述 简介 LBA Leaky Bucket Algorithm 漏桶算法是一种流行于网络通信领域的流量控制/频率限制算法。漏桶算法的核心原理是通过一个概念上的“漏桶”来…