【Java】如何根据应用场景选择合适的消息中间件?

news2024/12/23 13:15:19

一、问题解析

21.1 消息中间件的应用场景

消息中间件的应用场景主要有两个:异步解耦与削峰填谷。

我们首先通过电商平台用户注册送积分、送优惠券这个场景来理解异步解耦合。如果不使用消息中间件,电商平台送积分的实现也许是下图这个样子:

我们简单看一下这个流程。

  1. 用户在网站前端注册页面填写相关信息,然后调用账号中心服务,注册账号。
  2. 账户中心首先执行用户注册逻辑处理(例如判断用户是否已注册、是否符合注册条件等),然后写入到数据库。
  3. 注册成功后,需要调用积分中心(赠送积分接口)给用户送积分。
  4. 送完积分后,再调用优惠券相关接口,为用户赠送优惠券。
  5. 成功送完积分、优惠券后,向用户返回“注册成功”

从架构角度看,上面这个实现方法有一个非常严重的问题,那就是可扩展性低。

例如,如果要在春节期间调整活动策略,在发送积分的同时,还需要额外发送新春大礼包,开发人员为了实现这一功能,就不得不修改用户注册流程,并重新部署用户注册模块。

从功能维度来看,这次需求的变更集中在活动相关的内容。用户注册本身的逻辑并未发生变化,但由于用户注册逻辑与活动模块存在耦合,两个模块必须一起调整和发布,这就对系统稳定性造成了影响。

另外,调用积分、优惠券两个远程 RPC 请求让用户注册主流程变长,在高并发场景下,用户注册这一环容易成为系统瓶颈。

要解决上面这两个明显的设计缺陷,常用的方案是引入消息中间件,让用户注册主流程和商家活动异步解耦合。改造后的时序图如下:

账户中心完成用户注册相关逻辑后,会向 MQ 发送一条消息到 MQ 服务器,然后就直接给用户返回“注册成功”。赠送优惠券、积分等与活动相关的需求我们可以异步执行,这样,无论后续互动逻辑发生什么变化,账户中心都不需要发布新版本。

引入送积分服务(MQ 消费者应用)和送优惠券服务(MQ 消费者应用)会订阅消息,并根据消息调用积分中心、优惠券中心的服务。如果后续活动发生变化,例如取消送积分活动但开始赠送新春大礼包,那我们只需停止送积分服务应用,增加送新春大礼包的消费者应用,就可以真正做到对新增开放,对修改关闭。

消息中间件的另外一个常用场景是削峰填谷。我们来看一个外卖骑手送餐的场景。它的设计架构图如下:

我们分别说明一下“创建订单流程”和“查询订单信息”两个流程,探究一下这个方案的精髓。

先来看创建订单流程。

  1. 用户在 App 中下单,App 会调用网关相关接口创建订单,网关接收到请求后,并不是直接调用内部商户订单中心来创建订单接口,而是先发送一条消息到 MQ。
  2. 商户接单模块(Consumer)订阅 MQ 中的消息,处理消息的时候调用内部商户订单中心创建订单接口,创建一条真正的订单数据到数据库。
  3. 创建订单后,商户订单中心将再发送一条消息到 MQ 服务器。然后骑手分配模块(Consumer)订阅消息,调用派单服务相关接口,引导骑手进行外卖配送。
  4. 同时,数据同步组件(Canal)将数据库中的数据准实时同步到 Es 服务器。

为什么网关不直接调用外部的创建订单接口,而是将数据先写入到 MQ 中呢?

我们不妨设想一下,商户订单中心支持的最大并发为 1w/tps。如果某一个业务高峰期,从网关进入的流量突然飙升到 1.5w/tps,而且持续了 10 分钟,商户订单系统会直接崩溃,造成服务不可用等严重故障!

那该如何解决呢?

有人可能会说,我们可以使用限流机制保护商户订单系统。例如,我们只允许 9000TPS 的流量从网关进入到商户订单中心,直接拒绝多余的流量,让客户端重试。这确实可以解决问题,但会带来经济损失和糟糕的用户体验。

这个时候我们有一个更加友好的解决方案:引入消息中间件。

引入消息中间件的目的是让它来扛住海量流量,流量先进入到消息队列中,然后消费端下游系统可以慢慢消费消息中间件中的数据,这样能有效保护下游系统不被瞬时的流量击破。这种方案可能带来的最坏结果就是,消费这些消息会存在延迟。但这些订单都可以成功创建,真正的交易行为已经产生了。接下来要做的就是根据实际情况扩容或者缩容,尽快将积压的数据处理掉。

不过我们这个时候引入消息中间件,其实潜台词是它们的性能必须满足下面几个基本要求:高吞吐量、低延迟,还要具体消息堆积能力。

我们再看一下订单查询流程:

  1. 用户在 App 端发起订单查询,App 会调用网关的订单查询接口,网关再将请求转发到内部的订单查询服务;
  2. 订单查询服务不是在 MySQL 数据库,而是直接查询 Es 中的数据。

这里一个设计的亮点是,引入了数据同步组件 Canal,将 MySQL 数据库中的数据实时同步到了 Es。这样查询订单时只查 Es 就可以了,实现了订单写入与订单查询在异构数据源的读写分离

21.2 消息中间件的技术选型

在这节课的最后,我们来看看如何选择消息中间件。

目前消息中间件领域主要的中间件包括 RocketMQ、Kafka 和 RabbitMQ,我们先来看一下这张功能对比图:

结合上面这张图,我们再对比分析一下。

首先,我认为功能级别不具备一票否决权

例如,RabbitMQ 支持优先级队列,而 RocketMQ、Kafka 不支持,那么如果我们的项目中有优先级队列的使用诉求,我们就必须将 Kafka、RocketMQ 排除掉,选择使用 RabbitMQ 吗?我是不建议这样做的,任何涉及到功能的短板,都可以通过其他方式实现。

但我也并不是说功能特性就一点都不重要。这一点我在后面讨论 RocketMQ 与 Kafka 的选型时会再次谈到。

其次,我认为在选型时要特别注意中间件的性能和扩展性。

因为随着业务不断地发展,性能问题会越来越突出,而且性能问题都具有隐蔽性,一旦发生,破坏性大,影响程度深,让人防不胜防。

例如,RabbitMQ 的消息堆积能力不强,一旦消费端无法及时将消息处理掉,会极大影响消息服务器发送消息的性能。这一点是非常致命的,因为引入消息中间件的目的就是抵挡住洪峰流量,如果消息中间件因为积压问题影响了消息的发送,那是万万不可取的。

因此,从性能的角度来看,RocketMQ 和 Kafka 比 RabbitMQ 的表现更好。

另外一个重要的因素也不得不加以考虑,那就是中间件使用的编程语言。

在使用中间件时一般都会遇到很多问题,一个非常行之有效的方法就是深入研究源码。这时候,如果中间件的编写语言和团队技术栈不匹配,将会极大地增加深入研究这款中间件的难度。如果团队对中间件的掌控能力很弱,自然很难保持中间件的稳定运行。

在进行具体的选型时,我们可以结合自己团队的实际情况。

  • 如果公司或团队的技术栈以 Golang 为主,建议选择 RabbitMQ,RabbitMQ 在性能上的缺陷可以通过搭建多套集群加以规避。
  • 如果公司或团队的技术栈以 Java 为主,我建议使用 Kafka 或 RocketMQ。RocketMQ 和 Kafka 都是性能优秀的中间件,在这两者之间进行选择时可以更多地关注功能特性。RocketMQ 提供了消息重试、消息过滤、消息轨迹、消息检索等功能特性,特别是 RocketMQ 的消息检索功能,因此 RocketMQ 很适合核心业务场景。而 kafka 更加擅长于日志、大数据计算、流式计算等场景。
  • 二、粉丝福利

  • 我根据我从小白到架构师多年的学习经验整理出来了一份80W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴斯我一下,或者评论区扣“求分享”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五讲:51单片机+RA8889驱动控制彩屏 完整源码说明 【 源码v1.2 】

51单片机驱动控制彩屏系列讲座 第一讲:单片机STC89C52RA8889驱动控制彩屏【 源码v1.0 】 第二讲:单片机STC89C52RA8889驱动控制彩屏 代码移植介绍 第三讲:单片机STC89C52RA8889驱动控制彩屏 代码的压缩(Keil编译器) 第…

【虚拟现实】二、主要的AR/VR硬件设备

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 2.1 微软HoloLens 微软HoloLens是一款领先的混合现实设备,结合了AR和VR的元素,允许用户…

如何安装和配置JDK?(详细步骤分享)

1、下载JDK 访问Oracle官方网站(Oracle | Cloud Applications and Cloud Platform),选择适合您操作系统的JDK版本进行下载。建议下载最新的稳定版本。 打开Java,往下拉,找到Oracle JDK 打开后,选择右边的J…

论文Abstract怎么写

摘要是你要写的最后一项内容 步骤 首先先通读自己的文章,清楚自己写的文章是研究型还是技术型,适合描述性的摘要还是知识性。 描述性摘要内含研究目的、目标及方向等,不讲研究结果。字数大约100-200字。知识性摘要则包含研究结果&#xff0c…

日期类型的页面设计

此文章介绍一下日期类型的页面设计 目录 前言 一、设计图 1、星期周期 2、指定日期 3、日期范围 4、日期类型 二、存储逻辑 总结 前言 需求需要配置某天或者某个日期范围或者工作日等做什么事情,需要一个设计图,此文章用来记录设计图纸。 一、设计图 1…

EdgeView 4 for Mac(快速图像查看器) v4.7.5激活版

EdgeView 4是一款图片浏览和管理软件,它可以帮助你快速浏览、编辑和管理图片。EdgeView 4支持多种常见的图片格式,包括JPG、PNG、GIF、BMP、TIFF等,并且可以对图片进行旋转、裁剪、调整大小、添加水印等操作。此外,它还支持批量处…

心理咨询系统源码|心理咨询系统开发|心理咨询系统

心理咨询系统,作为一种集现代化科技与专业心理服务于一体的工具,正逐渐渗透到我们生活的各个角落。它不仅为个人提供了便捷的心理支持,还为企业和组织带来了全新的管理方式。下面,我们将深入探讨心理咨询系统的可应用范围及其带来…

【LLM之RAG】KG_RAG论文阅读笔记

研究背景 该研究集中于通过将生物医学知识图谱(KG)与大型语言模型(LLMs)集成,以增强LLMs在生物医学应用中的表现。研究的动机源于LLMs在生成精确内容方面面临的挑战,尤其是在像生物医学这样准确性至关重要…

重生之 SpringBoot3 入门保姆级学习(18、事件驱动开发解耦合)

重生之 SpringBoot3 入门保姆级学习(18、事件驱动开发解耦合) 5、SpringBoot3 核心5.1 原始开发5.2 事件驱动开发 5、SpringBoot3 核心 5.1 原始开发 LoginController package com.zhong.bootcenter.controller;import com.zhong.bootcenter.service.A…

【C++】stack、queue和deque的使用

💗个人主页💗 ⭐个人专栏——C学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读 一、stack 1. stack介绍 2. stack使用 二、queue 1. queue介绍 2. queue使用 三、deque 1. deque介绍 2. deque的…

软件安全漏洞分析与发现 复习笔记

1 绪论 本节无考点,仅供了解。 2 基础知识 考点: 汇编码理解和撰写,三种内存地址,不同的页管理方式。windows保护模式可能出题 汇编算法的阅读理解给出汇编片段,理解其意思,输入->输出保护模式…

基于MBD的大飞机模块化广域协同研制

引言 借鉴国外航空企业先进经验,在国内,飞机型号的研制通常采用基于模型定义(MBD)的三维数模作为唯一的设计制造协同数据源,从而有效减少了设计和制造部门之间的模型沟通成本和重构所需的时间,也减少或避免…

(2)图像识别yolov5—识别图片视频等文件

目录 一、识别示例图片 二、识别视频 三、修改 detect.py 代码以输出物体坐标,更改识别方式 四、更改后的演示代码: 一、识别示例图片 在yolov5文件夹中,有两个示例图片,这里我们对示例图片进行识别。 打开命令行,进入到当前yolov5目录,通过运行下面的指令,然后对…

ARM32开发--RTC内置实时时钟

知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 学习目标 学习内容 RTC时钟介绍 RTC结构框图 RTC原理图 RTC时钟电源 RTC的配置流程 RTC时钟 开发流程 RTC初始化 时钟配置 时钟获取 BCD格式转化 完整代码 RTC时钟备份寄存器 总结 前言 在嵌入式…

小众宝藏工作软件大公开

嘿宝贝们!👋 今天要跟大家种草几款超实用但相对小众的工作软件,让你的工作效率直线上升,还能享受工作的乐趣哦!💼🎉 1️⃣ 亿可达 - 作为一款自动化工具,亿可达被誉为国内版的免费Z…

MT2094 甜品供应

思路&#xff1a; 贪心策略&#xff1a;手下按r进行从小到大排序。用小根堆存储甜品。如果堆顶甜品无法被当前手下满足&#xff0c;则将甜品放回堆中&#xff0c;看下一个手下能不能满足。 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N …

新渠道+1!TDengine Cloud 入驻 Azure Marketplace

近日&#xff0c;TDengine Cloud 正式入驻微软云 Marketplace&#xff0c;为全球更多用户带来全托管的时序数据处理服务。这一举措也丰富了 TDengine 的订阅渠道&#xff0c;为用户提供了极大的便捷性。现在&#xff0c;您可以通过微软云 Marketplace 轻松订阅并部署 TDengine …

基于51单片机公交车报站系统—显示时间温度

基于51单片机公交车报站系统 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用LCD12864播报站台&#xff0c;显示当前站台和下一站&#xff0c;当前时间和温度&#xff1b; 2.站台名为一号到四号&#xff0c;下行从一号到四号&#xff0c;…

力反馈设备的融入让虚拟装配训练更具沉浸感

随着科技的快速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经在各个领域得到了广泛应用。其中&#xff0c;虚拟装配训练作为虚拟制造的重要组成部分&#xff0c;对于提高装配效率、降低设计成本以及提升产品质量具有至关重要的作用。然而&#xff0c;传统的虚拟…

大模型排行榜出炉!第一名不是ChatGPT!

前言 现在科技圈什么最火&#xff1f;当属大模型。 如雨后春笋般冒出的大模型&#xff0c;每一个都在争做行业No.1&#xff0c;但你知道现在哪个大模型能力最强&#xff1f;哪个最受人喜欢吗&#xff1f; 近期&#xff0c;清华大学发布《SuperBench大模型综合能力评测报告》…