如何理解微服务体系结构中的 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 模式。值得一提的是,这种模式的必要性可能发生在复杂的系统中。因此,应谨慎选择,以免给系统带来不必要的复杂性。
欢迎关注我的公众号程序员爱读书

如何理解微服务体系结构中的 CQRS的更多相关文章
- UBer面向领域的微服务体系架构实践
介绍 最近,人们对面向服务的系统架构和微服务系统架构的缺点进行了大量的讨论.尽管仅仅在几年前,由于微服务体系架构提供了许多好处,如独立部署的灵活性.明确的所有权.提高系统稳定性以及更好地分离关注点等, ...
- 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断
我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...
- SpringBoot2.1.9+dubbo2.7.3+Nacos1.1.4构建你的微服务体系
简单几步使用最新版本的DUBBO构建你的微服务体系 NACOS注册中心 从github下载最新版本的nacos 上传至服务器并解压 单机启动sh startup.sh -m standalone na ...
- Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构
Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...
- SpringBoot 快速构建微服务体系 知识点总结
可以通过http://start.spring.io/构建一个SpringBoot的脚手架项目 一.微服务 1.SpringBoot是一个可使用Java构建微服务的微框架. 2.微服务就是要倡导大家尽 ...
- Dubbo 如何成为连接异构微服务体系的最佳服务开发框架
从编程开发的角度来说,Apache Dubbo (以下简称 Dubbo)首先是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节.同时 Dubb ...
- 深入理解微服务架构spring的各个知识点(面试必问知识点)
什么是spring spring是一个开源框架,spring为简化企业级开发而生,使用spring可以使简单的java bean 实现以前只有EJG才能实现的功能. Spring是一个轻量级的控制反转 ...
- 应用Dubbo框架打造仿猫眼项目 理解微服务核心思想
1:传统应用带来的问题 单一业务开发的迭代问题 扩容困难 部署回滚困难2:微服务概述 微服务是一种将业务系统进一步拆分的架构风格 ...
- 从EJB规范理解微服务
晚上看了一篇从JavaEE谈微服务的文章,里面不少观点还是很有启发的,下面最有感触的,从失败的EJB谈微服务. 说起JavaEE规范,要先从EJB(Enterprise Java Bean),他是一种 ...
- Springboot揭秘-快速构建微服务体系-王福强-2016年5月第一次印刷
JavaConfig项目: spring IOC有一个非常核心的概念——Bean.由Spring容器来负责对Bean的实例化,装配和管理.XML是用来描述Bean最为流行的配置方式.Spring可以从 ...
随机推荐
- 清理MySQL的binlog日志
前言 MySQL的binlog是以二进制形式打印的日志,没设置自动删除的话,时间长了就会占用大量存储空间.删除MySQL的binlog日志有两种方法:自动删除和手动删除. 自动删除 永久生效:修改My ...
- golang1.21新特性速览
经过了半年左右的开发,golang 1.21 在今天早上正式发布了. 这个版本中有不少重要的新特性和变更,尤其是在泛型相关的代码上. 因为有不少大变动,所以建议等第一个patch版本也就是1.21.1 ...
- 微服务集成redis并通过redis实现排行榜的功能
默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...
- Linq关联两个DataTable合并为一个DataTable
DataSet ds ; DataTable dt1= ds.Tables[0]; DataTable dt2= ds.Tables[1]; //关联 var res = from m in dt1. ...
- jdk17下netty导致堆内存疯涨原因排查
背景: 介绍 天网风控灵玑系统是基于内存计算实现的高吞吐低延迟在线计算服务,提供滑动或滚动窗口内的count.distinctCout.max.min.avg.sum.std及区间分布类的在线统计计算 ...
- 用go封装一下二级认证功能
用go封装一下二级认证 本篇为用go设计开发一个自己的轻量级登录库/框架吧 - 秋玻 - 博客园 (cnblogs.com)的二级认证业务篇,会讲讲二级认证业务的实现,给库/框架增加新的功能. 源码: ...
- fopen各个模式区别
fopen 函数是C标准库中用于打开文件的函数,它接受一个文件名和一个打开模式作为参数,返回一个指向文件的指针. 这里解释各个模式的区别: "r": 以只读模式打开文件,文件必须存 ...
- VTable——不只是高性能的多维数据分析表格
导读 VTable: 不只是高性能的多维数据分析表格,更是行列间创作的方格艺术家! VTable是字节跳动开源可视化解决方案 VisActor 的组件之一. 在现代应用程序中,表格组件是不可或缺的一部 ...
- jmeter生成随机英文的几种方法
第一种:用BeanShell后置处理程序 1.写脚本 import java.util.Random; String random(int s_length) { strings= &qu ...
- 通过unittest加载测试用例的不同方法
使用python+unitest做自动化测试执行时, 执行用例时就涉及测试用例的加载. 即如何把测试cases加载到测试suite,然后进行运行. 一般把用例加载方法分为两大类:通过unittest. ...