【百面成神】消息中间件基础7问,你能撑到第几问

news2025/1/14 0:41:19

前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:纯手打总结面试题,自用备用
🌰 文章简介:消息中间件最基础、重要的9道面试题

文章目录

      • 1. 你怎么理解消息中间件
      • 2. 如何保证使用消息中间件时,消息不会丢失?
      • 3. 消息队列如何保证消息的顺序性。
      • 4.如何幂等处理重复消息呢?
      • 5.如何处理消息队列的消息积压问题
      • 6. 消息中间件如何做到高可用
      • 7.如何保证数据一致性,事务消息如何实现

1. 你怎么理解消息中间件

其实就是一个以队列作为消息通信的组件,本质上是一个消息转发器。可以对消息进行接收、存储和消费。当前业界比较流行的消息中间件有rabbitmq,rocketmq和Kafka。我用的比较多的是rabbitmq。

之所以使用消息中间件,主要是基于以下原因:
(1) 应用解耦
假设现在有一个订单系统,一个库存系统,他们之间可以进行交互,那么就是订单完成会削减库存。但此时如果引入一个积分系统,他们也存在交互关系,订单完成则用户需要进行积分计算。这时候就需要改变订单系统的源代码,来实现与库存系统的交互。此时各个应用子系统之间是直接耦合的。引入消息中间件就是为了解决这样的问题。订单下单后,将消息生产存储到中间件,而其他的积分系统、库存系统都只需要在消息中间件中进行消息的消费即可。
(2) 削谷平峰
如在秒杀活动中,为了避免流量暴涨,从而击垮应用,就可以将消息暂存在消息中间件中,慢慢对其中的消息进行处理。
(3) 异步处理
一个业务上经常有的案例是,在用户注册后,需要将注册信息进行入库,同时还需要进行短信通知与邮件通知。如果串行执行,每个操作许愿30ms,一共就需要90ms时间。如果引入消息队列,可以入库后写入消息中间件,写入操作一般很快,预计3ms,然后异步发送邮件和短信,耗时就只需要62ms了。
(4) 消息通信
消息队列中内置了高效的消息通信机制,可以实现点对点通信,聊天室等
(5) 远程调用
可以基于消息队列,自研远程调用框架。

2. 如何保证使用消息中间件时,消息不会丢失?

以rabbitmq为例,消息从生产端到消费端需要经过三个步骤:
(1) 生产端将消息发送到rabbitmq
(2) Rabbitmq将消息发送给消费者
(3) 消费者对消息进行消费

因此,保证消息不会丢失的关键在于:确保生产端和消费端的消息的可靠性

消费端可靠性机制有以下几种:
(1) 事务消息机制,消息发送后,生产端阻塞等待消费者的响应,得到响应后发送下一个消息。这种机制是同步机制,会严重降低性能,不建议使用。
(2) confirm消息确认机制:顾名思义,消费者在接收到消息后会发送确认消息给生产者,如果生产者没有收到确认消息,可以进行消息重发。实际上,因为生产者丢失消息的可能性很小,监听重发的代价会影响性能。一般我们在生产中记录日志,顺便发个邮件给相关人员,方便进行问题回溯即可。如果确实属于消息生产者丢失消息的罕见情况,可以由开发在数据库执行补数据的操作即可。
(3) 消息持久化:rabbitmq中的数据是存储到内存中的,为了避免由于rabbitmq宕机导致消息丢失,就需要采用持久化策略将其存储到磁盘中。Springboot会默认对消息进行持久化
(4)将消息存储到数据库中,并且设置状态变量status。当status=0时,说明消息没有被消费,一定时间后,消息还未被消费,需要进行消息重发。为了避免一直进行消息重发,需要设置重发次数,当超过重发次数,则做另外的处理。

生产端可靠性机制有以下几种:
(1) Springboot重试机制
SpringBoot 给我们提供了一种重试机制,当消费者执行的业务方法报错时会重试执行消费者业务方法。
(2)ACK机制改为手动
RabbitMQ的自动ack机制默认在消息发出后就立即将这条消息删除,而不管消费端是否接收到,是否处理完。
我们需要进行手动消费

3. 消息队列如何保证消息的顺序性。

比如一个订单要先下单、再付款。如果生产者生产了两个消息,第一条消息需要发给下单系统,第二条消息需要发送给付款系统,我们需要维护这两条消息按照顺序消费。

什么情况会导致顺序性问题呢?
第一个是一个生产者对应多个消费者。
第二个场景是一个生产者的消息由一个消费者进行消费,但是消费者是多线程并发消费。

如何避免出现顺序性问题呢?
以rabbitmq为例。
(1)第一种场景 可以拆分为多个queue,一个queue对应一个消费者。也就是说具有顺序性要求的消息放在同一个queue里,由同一个消费者消费。这样略繁琐,同时也可能造成吞吐量下降。
在这里插入图片描述

(2) 第二种场景可以一个queue对应一个cumsumer,consumer内部以内存队列形式进行排队,底层分发给不同的worker执行,具有顺序要求的消息由同一个worker处理。
在这里插入图片描述

4.如何幂等处理重复消息呢?

幂等性在计算机科学中指的是一次请求和多次请求执行的影响效果相同。

为何需要幂等?
比如一个转账操作,如果转账请求执行后,没有返回结果。可能是转账请求没有送到,也可能是请求送到了,返回结果丢了。这个时候我们需要重试,但必须能够确保这样的重试不会多转一笔钱。

其解决方法有:
(1) 设计一个本地表,通过唯一的主键或者其他业务标识,每一次处理请求进行一次校验。
(2) 也可以使用redis缓存业务标记,每次看下是否已经处理过了。

5.如何处理消息队列的消息积压问题

消息挤压是由于生产者生产消息的速度比消费者消费消息的速度更快。

出现消息挤压得情况,首先需要排除下是不是由于bug导致的。

如果不是由代码bug导致的,消息是一条一条处理时,可以考虑是否可以进行批处理。也可以进行水平扩容在,增加对应topic的消费者机器数量。

如果是bug导致几百万消息持续积压几小时。有如何处理呢? 需要解决bug,临时紧急扩容。扩容后等问题解决后再恢复原来的部署架构。

6. 消息中间件如何做到高可用

以rabbitmq为例,实现高可用是基于镜像集群模式。无论queue的元数据还是queue中的消息都会同时存在与多个实例上. 这种方式的好处就在于, 任何一个服务宕机了,都不会影响整个集群数据的完整性, 因为其他服务中都有queue的完整数据, 当进行消息消费的时候,连接其他的服务器节点一样也能获取到数据.
在这里插入图片描述

缺点:
1: 性能开销大: 因为需要进行整个集群内部所有实例的数据同步
2:无法线性扩容: 因为每一个服务器中都包含整个集群服务节点中的所有数据, 这样如果一旦单个服务器节点的容量无法容纳了怎么办?.

7.如何保证数据一致性,事务消息如何实现

可以使用事务消息。

生产者产生消息,发送一条半事务消息到MQ服务器
MQ收到消息后,将消息持久化到存储系统,这条消息的状态是待发送状态。
MQ服务器返回ACK确认到生产者,此时MQ不会触发消息推送事件
生产者执行本地事务
如果本地事务执行成功,即commit执行结果到MQ服务器;如果执行失败,发送rollback。
如果是正常的commit,MQ服务器更新消息状态为可发送;如果是rollback,即删除消息。
如果消息状态更新为可发送,则MQ服务器会push消息给消费者。消费者消费完就回ACK。
如果MQ服务器长时间没有收到生产者的commit或者rollback,它会反查生产者,然后根据查询到的结果执行最终状态。

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

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

相关文章

Android中的MVVM架构:使用Jetpack组件实现现代化的应用架构

Android中的MVVM架构:使用Jetpack组件实现现代化的应用架构 Jetpack组件是构建现代Android应用的绝佳利器,组件化设计让构建App如此简单。 引言 随着移动应用的日益复杂和功能的不断增加,构建稳健、可扩展和易维护的Android应用变得越来越重…

[考研数据结构] 第3章之队列的基本知识与操作

文章目录 队列的基本概念 队列的顺序存储 顺序队列 存储类型 基本操作 循序队列 存储类型 基本操作 循环队列判空与判满的三种解决方案 方法一:牺牲一个存储单元 方法二:类型增设记录型变量size 方法三:类型增设标志型变量tag 队…

嵌入式【协议篇】CAN协议原理

一、CAN协议介绍 1、简介 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。 其实可以简单把CAN通信理解成开一场电话会议,当一个人讲话时其他人就听(广播),当多个人同时讲话时则根据一定规则来决定谁先讲话谁后讲…

【音视频】 zlm的几个代理接口解释

目录 12、/index/api/addStreamProxy 30、/index/api/addStreamPusherProxy 14、/index/api/addFFmpegSource 24、/index/api/openRtpServer 27、/index/api/startSendRtp 参考 12、/index/api/addStreamProxy 拉流代理 : 194上在播放。 而10.30.2.6上加上这个…

FastDGCNN

Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data | IEEE Journals & Magazine | IEEE Xplore ​​​​​​​题目:Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data(更快的动态图形CNN:对…

Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点

文章目录 前言改变 View 的属性,进行旋转、缩放、平移输出 View 的属性 使用 matrix 映射 view 变换后的外矩形前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响前(左)乘(preXxx) 的意义后(右)乘(postXxx) 结论 来张图 前言 Android View 通过平移、旋转、…

找PPT模板就上这5个网站~

分享几个可以永久免费下载PPT模板、素材的网站,上万个模板随便下载,赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 网站素材非常全面,主要以设计类素材为主,办公类素材也很多&#x…

4、RSA终端指令

RSA总结 加密算法,都是数学知识对称加密(传统加密算法)RSA(三个人的名字)非对称加密(现代加密算法) 原根欧拉函数、欧拉定理(费马小定理)模反元素 m^(e * d) mod n ≡ m迪菲赫尔曼密钥交换RSA算法 RSA: 拆解两个(大)质数的乘积很难!所以RSA想对安全.加密: M ^e % N C解密: C…

前端学习:HTML头部、布局

目录 HTML头部 一、HTML 元素 二、head标签和header标签的不同 三、HTML 元素 四、HTML 元素 五、HTML 元素 六、 HTML 七、HTML元素 为搜索引擎定义关键词: 为网页定义描述内容: 每60秒刷新当前页面: 八、HTML 九、HTML头部元素…

Vue项目搭建流程

目录 1、通过命令创建 2、npm下载依赖 3、路由配置 4、配置组件 5、对axios进行二次封装 6、全局接口请求封装 7、配置跨域(反向代理) 1、通过命令创建 create vue 项目名 2、npm下载依赖 nmp i 依赖名版本号 axios1.2.1 echarts5.1.2 element-ui2.15.12 vue-router3…

56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载

文章目录 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载56.1 安装56.2 运行56.3 卸载 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载 56.1 安装 配置本地yum源,详细信息请参考《openEuler 22.03-LTS 搭建repo服务器》。 清除缓存。 # dnf clean…

【SpringBoot】1、SpringBoot整合JWT实现Token验证

这里写目录标题 1.单点登录1.1 单系统登录1.1.1 单系统登录流程(使用Session实现单系统登录) 1.2 多系统(单点)登录1.2.1 单点登录实现方案1.2.1.1 Session跨域1.2.1.2 Spring Session共享 1.3 Token机制1.3.1 传统身份认证1.3.2 基于Token的身份认证 1.4 JWT机制1.4.1 JWT数据…

Redis集群部署详解

文章目录 集群环境集群搭建测试集群故障转移集群扩容集群缩容 集群环境 集群介绍 1.什么是集群 所谓的集群,就是通过增加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。 2.使用redis集群的必要性 单个redis存在不稳定…

9.6 数组的指针和指向数组的指针变量 - 3

9.6 数组的指针和指向数组的指针变量 - 3 一.回顾二维数组和多维数组的概念二.指向多维数组的指针和指针变量探究1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是10002.a1 , a2 分别代表第一行首地址和第二行首地址。3.这表示a[0],a[1],a[…

Mapbox-gl.js v2.13.0 扩展支持4326,4490坐标系

mapbox-gl.js新版本中,支持多种projection 显示效果也不错,根据tiles grid可以看到,还是web_mercator的格网,基于图片做了一定的拉伸形变,想要加载4326的切片格网,依然无法实现。 后来在网上搜索加载4326切…

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)

目录 一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期 二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门 二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协…

【转行互联网】转行互联网必看答疑

课程 追忆寻梦-转行互联网必备知识 https://edu.csdn.net/course/detail/31180 2023年,迟来的编程私教服务 https://bbs.csdn.net/topics/613231237 优先 必读文章 初学者,打算改行学编程,怎么学习java?求指教。https://bb…

如何抓住IT行业最后的红利?网络安全为什么是风口行业?

前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

C语言指针及数组的运行原理

C语言指针及数组的运行原理 文章目录 C语言指针及数组的运行原理一. 指针(汇编角度)二. 数组(汇编角度)2.1 数组的定义2.2 指针与数组结合 三. 指令解释参考3.1 nop3.2 leave3.3 ret 这里涉及汇编,虚拟机这边采用的是6…

如何在 Google Cloud 上部署 EMQX 企业版

Google Cloud 的 IoT Core 产品将于 2023 年 8 月 16 日停止服务,随着这一日期的临近,许多用户正在为他们现有的物联网业务寻找新的解决方案,而 EMQX 企业版是实现这一目标的理想选择。 EMQX 企业版是一款大规模分布式 MQTT 消息服务平台&am…