如何理解微服务体系结构中的 CQRS

本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII。

问题描述

在典型的软件应用程序中,有一个负责写入和读取操作的数据存储。通常,应用程序实现一些 CRUD 操作,并且非常简单。你存储了一些东西并读取了相同的结果。

然而,在复杂的应用程序中,情况并不是那么简单。每个操作都需要很多操作和约束。

例如:

  • :数据库是以规范化的方式构造的,以消除数据重复并强制约束。:复杂的读取查询需要大量对性能产生负面影响的联接(joins)/联合(unions)/聚合(aggregations)。

  • :优化查询需要索引。:每次操作都会更新索引。

  • 读/写表示可能不同,这可能是附加逻辑的原因。

  • 在对同一数据进行并行操作期间,可能会发生数据争用。

  • 由于数据库的负载,性能可能很差。


CQRS

上述问题的解决方案是 CQRS(Command Query Responsibility Segregation)。

让我们回顾一下上面的图片。它包含两个服务:旅馆管理服务旅馆预订服务(实际上,如果需要的话,可以有多个不同的预定服务及其各自的数据库)。这些服务之间的数据应该同步。为此,通常使用一些消息代理(例如 Kafka。这些服务的数据格式不同。

旅馆管理服务负责创建/更新/删除操作,每个操作都被描述为一个命令:

  • 生成/批准/拒绝一个酒店创建请求。

  • 添加/更新酒店房间到系统。

  • 更改酒店房间的价格。

  • 预订特定时间段的酒店房间。

  • 请求其他服务。

  • 生成请求留下/批准/拒绝评论。

  • 取消预订。

旅馆预订服务仅负责向用户显示酒店/房间列表:

  • 列出一个城市中所有/可用的酒店房间。

  • 在地图上显示所有酒店(按地理位置过滤)。

  • 向用户显示可用的过滤选项。

  • 通过指定的过滤器过滤酒店房间(例如,显示两个酒店房间,而不是一个多人房间)。

正如你所见,服务提供的责任是不同的。此外,指定服务的性能约束也不同。用户在预订之前通常会经过许多预订选项。因此,在这个系统中,操作的数量远远高于操作的数量。因此,这些服务的缩放将有所不同。

因此,一些 RDBMS 可以用作旅馆管理服务的数据存储,例如 MySQL或 PosgreSQL。RDBMS 将为保持数据安全提供它的所有好处。

旅馆预订服务可以基于一些 NoSQL 解决方案,如 MongoDB或 Elasticsearch。这背后的原因是执行高效搜索查询的能力:反规范化、地理位置搜索支持、索引、水平缩放等。

CQRS 优势

  • 关注点分离。

  • 单个读写服务缩放。

  • 适合读写操作的数据存储及其模式(schema)。

  • 简单高效的查询。

CQRS 劣势

  • 复杂性。

  • 最终一致性。


总结

在本文中,我们回顾了 CQRS 模式。值得一提的是,这种模式的必要性可能发生在复杂的系统中。因此,应谨慎选择,以免给系统带来不必要的复杂性。

文章转载自:阿呜的边城

原文链接:https://www.cnblogs.com/dev2007/p/17874290.html

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

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

相关文章

一文读懂中间件

前言:在程序猿的日常工作中, 经常会提到中间件,然而大家对中间件的理解并不一致,导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品,在不同文献中有着许多不同的中间件定义,包括操…

Hadoop学习笔记(HDP)-Part.13 安装Ranger

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

粒子群优化算法的实践

粒子群优化算法的实践 flyfish 粒子群优化算法(Particle Swarm Optimization,PSO)或者粒子群算法 红叉的地方是理想之地,这些粒子都想去,总结8个字是信息共享,个人决策。 上完图之后,上代码&a…

Vue JAVA开发常用模板

1.VsCode添加模板 左下角设置》用户代码片段 新建全局代码片段》将模板粘贴仅文件(prefix用于指定触发关键字) 添加成功过后输入配置的关键字即可使用 1.1 vue2模板 {// Example:"Print to console": {"prefix": "vue2",…

vue实现数字千分位格式化 如6,383,993,037,937.463

1.封装文件:numberToCurrency.js /**实现数字千分位格式化 如6,383,993,037,937.463 */ export function numberToCurrencyNo(value) {if (!value) return 0// 获取整数部分const intPart Math.trunc(value)// 整数部分处理,增加,const intPartFormat …

使用 Go Modules 管理依赖:简明教程

一、GoLang 中包的介绍和定义 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案Go 语言为我们提供了很多内置包,如 fmt、strconv、strings、sort、errors、times、encoding/json、os、io 等Golang 中的包可以分为三种&…

C++ 实现的Ping类的封装

Ping 使用 Internet 控制消息协议(ICMP)来测试主机之间的连接。当用户发送一个 ping 请求时,则对应的发送一个 ICMP Echo 请求消息到目标主机,并等待目标主机回复一个 ICMP Echo 回应消息。如果目标主机接收到请求并且网络连接正常…

SpringCloud+Nacos项目集成Seata分布式事务

上一篇: 《 Seata-分布式事务介绍 》: 简单介绍了分布式事务的实现方式,以及详细讲述了Seata-AT模式的两阶段提交步骤流程。 完整示例项目代码地址: https://gitee.com/cnyunze/yz-seata.git Seata快速上手 安装教程Seata Server…

动手学深度学习笔记

1. 深度学习基础与MLP 1.1 框架: 线性回归; Softmax回归(实际上用于分类问题); 感知机与多层感知机; 模型选择; 权重衰退(weight decay); 丢弃法&…

sql面试题之累计消耗问题

sql中累计求和是我们比较经常遇到的问题,那么与之相反的累计消耗的问题不知你是否挑战过 –问题:在活动大促中,有玩游戏瓜分奖金环节。现有奖金池为3000元,代表奖金池中的初始额度 表中的数据代表每一个用户和其对应的得分&#…

Java 并发编程面试题——Java 线程间通信方式

目录 1.✨Java 线程间有哪些通信方式?1.1.volatile 和 synchronized 关键字1.2.等待/通知机制1.2.1.概述1.2.2.经典范式 1.3.管道输入/输出流1.4.信号量 2.Thread.join() 有什么作用?它的使用场景是什么?3.Java 中需要主线程等待子线程执行完…

java:封装统一的响应体code、data、msg、paging

背景 我们在写接口的时候一般不会直接返回给前端数据,而是会有响应体,比如 code、data、msg,这样就有一个统一的结构方便前端处理,那么今天就来封装一个统一的响应体 封装基本响应体 1、在 config 包里新建 ApiResponse.java …

5+铜死亡+预后模型+分型生信思路,热点搭配免疫相关思路

今天给同学们分享一篇生信文章“The pathogenesis of DLD-mediated cuproptosis induced spinal cord injury and its regulation on immune microenvironment”,这篇文章发表在Front Cell Neurosci期刊上,影响因子为5.3。 结果解读: 基因芯…

LeetCode - 110. 平衡二叉树(C语言,二叉树,配图,简单)

根据题意,我们只需要比较当前节点的左右子树高度差是否小于1,利用分治法,只需要满足: 1. 根节点的左右子树的高度差小于1。 2. 根节点左右子树的满足高度差小于1,在往下走,判断左子树根节点的左右子树是否满…

质量检查管理制度

质量检查管理制度 建立健全质量检查管理制度,明确过程检查、最终检查、质量评定、检查记录和检查报告等要求

40.坑王驾到第六期:这是什么奇葩错误?

一、问题再现 在HbuilderX中引用了一个checkALL模块,正常编译然后启动到微信开发者工具,工具报错,找不到XXXXXX/index2.js。为什么编译后在微信工具中会自动加一个2呢???? 二、解决问题 经过清…

【Node.js】基础梳理 6 - MongoDB

写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和官方技术文档,文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

【LeetCode】每日一题 2023_12_5 到达首都的最少油耗(树,搜索)

文章目录 刷题前唠嗑题目:到达首都的最少油耗题目描述代码与解题思路 刷题前唠嗑 LeetCode?启动!!! 题目:到达首都的最少油耗 题目链接:2477. 到达首都的最少油耗 题目描述 代码与解题思路 …

Python代码编译并生成Docker镜像

Python代码编译并生成Docker镜像 前言 实际python项目交付时往往有针对关键代码进行保护的需求,本文介绍了一种简单可行的方案:1. 在Linux系统上先将 .py 文件编译为 .so 文件,2. 将整个项目打包成Docker镜像(解决 .so 文件的环…

【性能测试】业务/吞吐量与存量数据设计关系+压测常见解决方案

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、性能测试中业务…