本文翻译自 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的更多相关文章

  1. UBer面向领域的微服务体系架构实践

    介绍 最近,人们对面向服务的系统架构和微服务系统架构的缺点进行了大量的讨论.尽管仅仅在几年前,由于微服务体系架构提供了许多好处,如独立部署的灵活性.明确的所有权.提高系统稳定性以及更好地分离关注点等, ...

  2. 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断

    我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...

  3. SpringBoot2.1.9+dubbo2.7.3+Nacos1.1.4构建你的微服务体系

    简单几步使用最新版本的DUBBO构建你的微服务体系 NACOS注册中心 从github下载最新版本的nacos 上传至服务器并解压 单机启动sh startup.sh -m standalone na ...

  4. Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构

    Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...

  5. SpringBoot 快速构建微服务体系 知识点总结

    可以通过http://start.spring.io/构建一个SpringBoot的脚手架项目 一.微服务 1.SpringBoot是一个可使用Java构建微服务的微框架. 2.微服务就是要倡导大家尽 ...

  6. Dubbo 如何成为连接异构微服务体系的最佳服务开发框架

    从编程开发的角度来说,Apache Dubbo (以下简称 Dubbo)首先是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节.同时 Dubb ...

  7. 深入理解微服务架构spring的各个知识点(面试必问知识点)

    什么是spring spring是一个开源框架,spring为简化企业级开发而生,使用spring可以使简单的java bean 实现以前只有EJG才能实现的功能. Spring是一个轻量级的控制反转 ...

  8. 应用Dubbo框架打造仿猫眼项目 理解微服务核心思想

    1:传统应用带来的问题 单一业务开发的迭代问题              扩容困难              部署回滚困难2:微服务概述 微服务是一种将业务系统进一步拆分的架构风格          ...

  9. 从EJB规范理解微服务

    晚上看了一篇从JavaEE谈微服务的文章,里面不少观点还是很有启发的,下面最有感触的,从失败的EJB谈微服务. 说起JavaEE规范,要先从EJB(Enterprise Java Bean),他是一种 ...

  10. Springboot揭秘-快速构建微服务体系-王福强-2016年5月第一次印刷

    JavaConfig项目: spring IOC有一个非常核心的概念——Bean.由Spring容器来负责对Bean的实例化,装配和管理.XML是用来描述Bean最为流行的配置方式.Spring可以从 ...

随机推荐

  1. Docker使用教程及常用命令

    Docker是一个开源的应用容器引擎,允许开发者将应用以及依赖打包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows上.它非常适用于持续集成与持续交付(CI/CD). 1. 安装 ...

  2. 关于Openssh版本升级问题及版本升级到最新版8.7p1流程(CentOS7系统)

    前言: 对linux服务器做过漏洞扫描的都知道,常常服务器会被扫出一大堆关于openssh的漏洞,诸如下面这些,而其中的原因就是因为openssh版本比较低.于是就需要升级openssh的版本.下面就 ...

  3. 4.2 C++ Boost 内存池管理库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  4. 《Kali渗透基础》03. 被动信息收集

    @ 目录 1:被动信息收集 1.1:收集内容 1.2:信息用途 2:域名信息收集 2.1:nslookup 2.1.1:命令参数 2.1.2:示例 - 命令行 2.1.3:示例 - 交互式 2.2:d ...

  5. 《SQL与数据库基础》04. SQL-DQL

    目录 DQL 基础查询 条件查询 分组聚合 聚合函数 分组查询 结果排序 分页限制 总结 本文以 MySQL 为例 DQL 语法结构: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 ...

  6. Ds100p -「数据结构百题」41~50

    41.P3590 [POI2015]TRZ 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符,要么有多种字符,但是没有任意两种字符出 ...

  7. flask中cookies的使用

    flask中cookies的使用 在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, ...

  8. nginx配置kibana访问用户名和密码认证、及无认证访问配置

    转载请注明出处: 在nginx上配置kibana页面访问时,默认是采用kibana的认证,一般直接安装kibana后,是没有用户名和密码认证的. 如果要在负载均衡上配置反向代理和用户认证,可按以下步骤 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题

    三.用go语言,仿照图 10-2,画图表示依次执行操作 ENQUEUE(Q,4).ENQUEUE(Q,1).ENQUEUE(Q,3).DEQUEUE(Q).ENQUEUE(Q,8)和 DEQUEUE( ...

  10. 使用ensp搭建路由拓扑,并使用isis协议实现网络互通实操

    转载请注明出处: 1.通过拓扑搭建如下拓扑: 其中R7.R8为L1,R6为L1/2,R9为L2. 2.配置isis实现网络互通 R7配置如下: [Huawei]isis 1 [Huawei-isis- ...