当前位置:首页 > 科技  > 软件

微服务架构中实施CQRS失败的四个重大原因,引以为戒!

来源: 责编: 时间:2023-11-20 17:10:44 340观看
导读CQRS(命令查询职责分离)是一种在复杂商业应用中非常有用的模式,特别是当读操作和写操作有不同需求时。举个例子,写操作可能想要在关系型数据库中以规范化形式维护一个模型,而读操作则可以将模型表现为文档数据库中的文档。

CQRS(命令查询职责分离)是一种在复杂商业应用中非常有用的模式,特别是当读操作和写操作有不同需求时。举个例子,写操作可能想要在关系型数据库中以规范化形式维护一个模型,而读操作则可以将模型表现为文档数据库中的文档。但是理解CQRS并不容易。它涉及到读操作、写操作、事件、命令、领域驱动设计(DDD)、事件溯源以及最终一致性等概念。实现CQRS的常见方式是创建两个服务,并通过事件进行通信。FIf28资讯网——每日最新资讯28at.com

FIf28资讯网——每日最新资讯28at.com

我们的CQRS实现

为了将CQRS集成到我们的自定义框架中,我们使用了Axon框架。因为Axon是最容易使用的,并且对Spring Boot框架有很好的支持。架构图如下所示:FIf28资讯网——每日最新资讯28at.com

FIf28资讯网——每日最新资讯28at.com

我们为写入和读取创建了两个单独的服务。这两个服务通过 RabbitMQ 连接。FIf28资讯网——每日最新资讯28at.com

写入服务

写入服务处理所有的更新操作。我们并没有试图说服开发人员认为写请求就是真正的命令。控制器负责从请求中创建命令,并通过命令网关发布命令。控制器与命令处理程序之间的通信是异步的。命令处理程序通过加载聚合根,执行业务逻辑,然后将事件发布到RabbitMQ来处理命令。与此同时,事件也被保存到事件存储中。在这个实现中,事件存储充当我们的单一真相来源。FIf28资讯网——每日最新资讯28at.com

读取服务

读取服务处理所有读取请求。这里没有应用任何业务逻辑。通过监听发布到 RabbitMQ 的事件来更新数据。开发人员可以选择任何关系数据库或 MongoDB 作为读取数据库。我们希望开发人员实现的是读取优化的模型。它们可以存储数据而不进行任何规范化以提高读取性能。FIf28资讯网——每日最新资讯28at.com

这是一个非常简单的实现。我们将读取和写入分为两个服务,那么我们为什么失败了呢?FIf28资讯网——每日最新资讯28at.com

为什么我们失败了?

1. 异步性

当我们引入CQRS时,开发人员的主要抱怨是“我们将如何更新UI,我们不知道记录是否成功保存”。这是一个非常合理的问题,它涉及到我们所熟悉的同步通信方式。这种方式很好,也是我们从一开始就习惯使用的编码方式。因为它易于推理。我们可以得到请求的完整流程。FIf28资讯网——每日最新资讯28at.com

那么为什么我们在事件驱动架构(EDA)中使用异步调用呢?很简单,就是为了提高响应能力。EDA 与异步通信无关。我们可以在不使用异步通信的情况下实现 CQRS。FIf28资讯网——每日最新资讯28at.com

2.工作量大

第二个主要抱怨是“完成基于 CQRS 的微服务需要两倍的工作量。“ 开发人员必须创建两项服务:命令服务和读取服务。但这就是我们实施 CQRS 的方式。FIf28资讯网——每日最新资讯28at.com

3.对所有服务使用 CQRS

我们告诉开发人员的是在每个微服务中使用 CQRS。我们认为整个系统应该是一个CQRS系统。其结果是引入了难以管理的复杂性,这是我们在实施 CQRS 时犯的主要错误之一。FIf28资讯网——每日最新资讯28at.com

4.较小的微服务

我们不能说微服务应该有多小,但我们可以确定它的边界。我们可以使用DDD和限界上下文等概念来识别微服务边界。在 CQRS 中,我们使用聚合的概念。聚合是 逻辑上相关的域对象。例如订单和订单项目。我们将订单和订单项目视为一件事。当我们保存订单时,会将其与订单项目一起保存。当我们无法识别聚合时,最终会将其拆分为单独的微服务。这给 CQRS 增加了巨大的复杂性。当收到保存订单的请求时,要如何保存订单项目?FIf28资讯网——每日最新资讯28at.com

更小的微服务意味着更多的微服务。由于我们将 CQRS 应用于所有服务,最终使服务数量增加了一倍。这是无法控制的。FIf28资讯网——每日最新资讯28at.com

总结

这次失败的主要原因是因为错误的实现,并且大多数与 CQRS 无关。我们从中学到的是,必须理解微服务和 CQRS 的关键概念,然后才能将它们整合好。FIf28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-31528-0.html微服务架构中实施CQRS失败的四个重大原因,引以为戒!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 管理 Spring 微服务中的分布式会话

下一篇: 将 Spring 微服务与 BI 工具集成:最佳实践

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
Top