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

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

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

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

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

我们的CQRS实现

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

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

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

写入服务

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

读取服务

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

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

为什么我们失败了?

1. 异步性

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

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

2.工作量大

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

3.对所有服务使用 CQRS

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

4.较小的微服务

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

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

总结

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

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

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

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

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

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 华为开发者大会2023日程公开:开设鸿蒙HarmonyOS 4体验区

    IT之家 7 月 31 日消息,华为今日公布了 HDC.Together 开发者大会 2023 的详细日程。整场大会将于 8 月 4 日-6 日之间举行,届时将发布最新一代鸿蒙 H
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top