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

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

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

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

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

我们的CQRS实现

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

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

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

写入服务

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

读取服务

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

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

为什么我们失败了?

1. 异步性

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

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

2.工作量大

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

3.对所有服务使用 CQRS

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

4.较小的微服务

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

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

总结

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

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

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

上一篇: 华为“会员中心”和“我的华为”合并升级:成长值 1:1 转化为经验值,12 月 20 日起上线

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

标签:
  • 热门焦点
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现“美团直播”的固定入口。在直播聚合页面,外卖“神枪手”直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
Top