RabbitMQ---面试题

常见面试题

1.MQ的作用及应用场景

 类似问题:项目什么情况下用到了MQ,为什么要用MQ

MQ的主要应用场景,消息队列的应用场景,为什么说消息队列可以削峰

首先MQ是一种用来接收和转发消息的队列,常见的应用常见如下:

1)异步解耦:在业务中,一些操作需要消耗大量时间,但是并不需要我们立刻返回结果,我们就可以使用MQ来把操作异步化

2)流量削峰:在访问量突增的情况下,我们应用仍然要保证持续处理请求,但是突然把大量请求发送过来会导致我们的应用崩溃,我们也不可能按照最大访问量来配置机器,所以我们就可以使用MQ来控制流量,把请求排队,等系统根据自己的能力来逐渐处理请求

3)消息分发:当多个系统需要对同一数据做出响应,我们就可以使用MQ进行消息分发,我们这里可以用到广播模式

4)延迟通知:当我们想让对方过一段时间收到消息时,我们可以使用MQ的延迟消息功能,就比如在支付过程中,用户多久没有支付,就会自动取消订单

2.你了解过那些MQ,他们的区别是什么

类似问题:kafka和RabbitMQ的对比,对比其他MQ,不同MQ分别用在什么场景

kafka和rocketmq比较,消息队列除了可以使用RabbitMQ,可以使用RocketMQ吗

首先业界有很多MQ产品,我们这里简单介绍三种,RabbitMQ,RocketMQ,kafka

1)kafka:kafka的功能比较简单,但是效率很高,吞吐量大,可以达到单机10w的吞吐量,主要用来做大数据处理,和日志相关操作的

2)RabbitMQ:使用Erlang开发支持大部分主流语言,功能比较全面,效率虽不如kafka但是也很高,同时吞吐量虽然不大但也达到了单机万级的吞吐量,同时开源提供界面,社区活跃,对于新手十分友好,比较适合于一些并发量和数据量不大的情况

3)RocketMQ:采用Java开发,在可用性,功能以及稳定性方面比较突出,吞吐量能达到单机10w,但是支持的语言不多,且社区活动一般,适用于一些可靠性高,并发量大的场景

3.介绍下RabbitMQ的核心概念及工作流程

相关面试题:RabbitMQ的核心流程简单介绍下,讲下RabbitMQ的结构

RabbitMQ负责接收消息并且转发消息

核心概念:

Producer:生产者,向RabbitMQ发送消息的       Consumer:消费者,从RabbitMQ中获取消息

Broker:消息队列服务器        Vistual Host:虚拟机,逻辑上隔离的,可以用来做业务区分

Connection:网络连接,允许客户端和RabbitMQ进行通信    Channel:信道,发送消息和接收都是通过信道

Exchange:交换机,负责接收生产者的消息,并且根据Routingkey 映射到不同的队列

Queue:队列,用来存储消息直到被消费者消费

工作流程:创建连接,生产者连接到Broker(建立一个Connection和Channel)  声明交换机和队列  发布消息到Broker,消息处理(Broker接收消息并且存入相应队列,如果没有队列可根据return模式进行处理)  消费消息(消费者监听队列,消息到达,从队列获取消息,处理后给MQ返回是否确认)消息删除(确认就删除,不确认或者拒绝,可以重试或者有死信队列放入死信队列,否则丢失消息)

4.RabbitMQ如何保证消息的可靠性

相关面试题:RabbitMQ消息丢失原因及解决方案  , 如何保证消息不丢失,消息写入失败怎么办, 消息消费失败如何处理, MQ的主动ack和被动ack有什么区别,RabbitMQ怎么解决数据丢失问题,如何保证一致性 , 消息队列怎么保证消费者消息不丢失的

这个问题我们要从生产者的可靠性,MQ的可靠性,消费者的可靠性三方面回答

1)生产者的可靠性保障通过confirm模式来保证消息能够正确到达交换机(可能是网络原因也可能是交换机不存在),如果没到达可以选择重新发送或者不发送等等,通过return模式来确保如果消息没有被成功映射到队列上要怎么处理(映射不到队列上可能是Routingkey的原因也有可能是没有这个队列)我们可以加上一个死信队列,这样我们如果映射到的队列满了,也可以在死信队列找到我们的消息不至于丢失

2)MQ的可靠性保障通过消息的持久化,队列的持久化,交换机的持久化来保证,首先就是交换机要设置持久化,否则重启MQ后,该交换机信息就没了,我们需要重新声明,但是我们的消息是不会丢失的,因为消息是存储队列中的,队列的持久化也要记得设置,因为消息存储在队列上,如果队列没有持久化,那么重启MQ消息也会消失,最后就是消息持久化,我们设置消息持久化的前提是要设置队列持久化,否则队列丢了即使消息是持久化的,也会丢失(但是即使我们都设置持久化,也有极小的概率会丢失数据,因为我们队列上的消息写入硬盘,并不是来一个消息写一个,而是有一个缓冲区,我们缓冲区到达一定限制才会一次性写入硬盘,这样也能保证我们的效率)

3)消费者的可靠性主要有自动确认和手动确认两种方式,自动确认是不可靠的,因为自动确认是只要消息到达了消费者就确认,如果我们消费者消费失败,那么我们消息就会丢失,我们可以使用手动确认保证消费者的可靠性,这样如果我们业务有异常或者有网络问题,我们可以不进行确认,我们可以选择重试,或者直接把这条消息放到死信队列,我们可以进行人工处理

5.RabbitMQ怎么保证消息顺序性

相关面试题:RabbitMQ怎么保证消息的顺序性? 如何保证消息能够有序消费?

我们要先说RabbitMQ的顺序性分为局部顺序性和全局顺序性

全局顺序性很难保障而且使用场景很少,我们可以类似于TCP使用序号+消费者缓冲区来实现,通过序号在消费者缓冲区来排列实现有序

那么局部有序就比较好保障,我们可以使用单队列单消费者(这个由我们RabbitMQ自动保障不需要我们额外做处理) 如果我们嫌这样吞吐量比较低,我们可以使用分区消费,我们可以引入一个id,把同样的id(这个同样id是一个概念,也可以是hash过后同样的id)的放到一个队列,然后给这个队列分一个消费者,本质上也是单队列单消费者

但是RabbitMQ本身不支持分区消费,所以需要业务逻辑实现,我们可以使用Spring-cloud-stream来实现

也可以通过业务逻辑判断,比如在消费端内部实现消息排序顺序

6.如果保证消息消费时的幂等性

相关面试题:RabbitMQ怎么保证消息不被重复消费? 消息或者请求存在重复消费问题吗?

怎么解决MQ重复消费的问题?

解决方法:

1) 通过引入全局唯一ID:可以是UUID也可以是自增ID,只要保证ID不重复即可,这样我们消费一个消息,就把消息的ID放到数据库中

然后我们每次消费消息时,我们要判断消息的ID是否存在于数据库中,如果不存在,我们就把消息消费后把ID放到数据库,如果存在,我们放弃消费这一条消息

2) 业务逻辑判断:在业务逻辑层面实现消息处理的幂等性,就比如我们先判断数据库中是否有相关数据记录,或者使用乐观锁机制避免已被其他事务更改的数据,或者检查相关业务的状态,如果是未处理,我们再进行处理

7.RabbitMQ有那些特性?

1)发送方确认

2)持久化

3)消费者确认

4)重试机制

5)TTL

6)死信队列

7)延迟队列

8.介绍下RabbitMQ的死信队列

相关面试题:RabbitMQ的死信队列以及应用场景

回答问题从以下三个方面来:死信队列的概念,死信的来源,死信队列的应用场景

死信是一种因为一些特殊原因(消息过期,消息被消费者拒绝或者队列满了)而无法被正常消费的消息,死信队列就是用来存储死信的队列

死信的应用场景可以应用在支付场景中

我们用户支付订单,支付系统会给我们订单系统返回当前订单的支付状态

 为了保障支付信息不丢失,需要使用死信队列机制,当消息消费异常时,会放到死信队列中(有可能存在用户支付,但是消息没有被消费或者异常拒绝的情况),此时我们放到死信队列中,再对这个数据进行处理(可能是人工确认)

我们也可以通过死信队列来做错误日志收集,或者我们可以使用TTL+死信队列来实现延迟队列的效果

9.介绍下RabbitMQ延迟队列

相关面试题:RabbitMQ延迟队列的实现

我们也可以从三个方面回答:概念  应用场景  实现方式

延迟队列是一种特殊的队列,在消息发送后消费者并不会立刻收到消息,等过一段时间,才让消费者接收并处理消息

我们可以将延迟队列应用到定时发布场景,比如我们要定时发送一篇博客,我们就可以使用延迟队列来发布,也可以用在订单支付,我们用户在点击购买时,我们会设置一个延迟的消息放到延迟队列中,等时间到了用户还没有支付成功,那么就会销毁这个订单,也可用于只能家电的定时功能

我们可以通过TTL+死信队列的方式来实现,也就是通过TTL设置延迟时间,但是用户并不订阅正常的队列,而是订阅死信队列,这样过期时间到了,消息过期会放到死信队列中,然后我们用户就可以在死信队列中拿到消息,实现延迟功能(但是这样会有一些缺陷,也就是顺序问题,这样我们在TTL那篇博客有讲)

我们也可以使用延迟插件来解决 这个插件会给我们提供一个新的交换机,这个交换机可以实现延迟功能

问:TTL+死信和延迟插件的优缺点

TTL+死信:优点:比较灵活,不需要我们引入其他插件

缺点:有消息的顺序问题,可能会有错误

延迟插件:优点:没有消息的顺序问题

缺点:需要我们引入插件,同时会有一些版本问题,需要运维人员

10.介绍下RabbitMQ的工作模式

相关面试题:RabbitMQ的几种模式有哪些

我们看一张图就可以解决

同时我们要知道交换机是有多种的,有dirct(定向),topic(通配符),fanout(广播),headers 

11.消息积压的原因,如果处理

相关面试题:MQ消息堆积问题,如何解决MQ的数据囤积

消息积压的原因:消息生产过快,消费者消费能力不足,网络问题,RabbitMQ服务配置低

消费者消费能力不足可能是因为:业务逻辑太复杂,代码的逻辑性能低,消费者异常处理问题,系统资源问题

解决办法:

我们可以通过限制消息的生产速率减轻消息生产速度,设置ttl,把消息转入死信队列等有空时再进行处理

我们消费者优化代码,或者多加几个队列共同消费设置消息分发,当一个消费者阻塞,把消息分发给其他消费者消息发生异常,设置重试策略,或者转入死信队列

如果是资源问题,就只能提高配置

12.RabbitMQ是推模式还是拉模式

RabbitMQ支持推模式(队列把消息主动给消费者)和拉模式(消费者从队列中主动获取消息)

但是主要是基于推模式来工作的(推模式会把队列的所有消息都给消费者),它的核心设计是让消息队列中的消费者接收到生产者生产的所有消息,使用channel.basicConsume方法订阅队列,RabbitMQ就会把消息推送到订阅该队列的消费者,如果只是想获取单条消息,而不是持续订阅就使用我们的拉模式,使用channel.basicGet

总结:

推模式:能够一次性获取到所有的消息,对消息获取更加实时,适合对数据实时性要求比较高的场景,就比如监控系统,报表系统

拉模式:一次只能够拉取到队列的一条消息,可以按照自己的速度来拉取消息,避免消息积压,适合需要流量控制的场景

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全球AI模型百科全书,亚马逊云科技Bedrock上的100多款AI模型

今天小李哥给大家介绍的是亚马逊云科技上的AI模型管理平台Amazon Bedrock上的Marketplace,这是亚马逊云科技在今年re:Invent发布的一个全新功能,将亚马逊的电商基因带到了其云计算平台,让我们能够通过Amazon Bedrock访问100多种流行、新兴和专…

八种排序算法【C语言实现】

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

在 vscode + cmake + GNU 工具链的基础上配置 JLINK

安装 JLINK JLINK 官网链接 下载安装后找到安装路径下的可执行文件 将此路径添加到环境变量的 Path 中。 创建 JFlash 项目 打开 JFlash,选择新建项目 选择单片机型号 在弹出的窗口中搜索单片机 其他参数根据实际情况填写 新建完成: 接下来设置…

PyQt5之QtDesigner的若干配置和使用

1.描述 QtDesigner是一个可视化工具,可以通过该工具设计页面 2.简单使用 1.下载PyQt5-tools pip install pyqt5-tools 2.打开designer.exe文件 我采用的是虚拟环境,该文件位于C:\Users\24715\anaconda3\envs\pyqt\Lib\site-packages\qt5_applicatio…

【高项】6.3 排列活动顺序 ITTO

输入 项目管理计划组件: ① 进度管理计划;② 范围基准 项目文件: ① 假设日志;② 活动属性;③ 活动清单;④ 里程碑清单 工具与技术 紧前关系绘图法(PDM) ① 完成到开始&…

Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接

介绍 通常用于将文档中的文本数据拆分成易于索引的词项(tokens)。有时,默认的分词器无法满足特定应用需求,这时就可以创建 自定义分词器 来实现定制化的文本分析。 自定义分词器组成 Char Filters(字符过滤器&#x…

Leecode刷题C语言之完成所有交易的初始最少钱数

执行结果:通过 执行用时和内存消耗如下&#xff1a; long long minimumMoney(int** transactions, int transactionsSize,int* transactionsColSize) {long long total_lose 0;int res 0;for (int i 0; i < transactionsSize; i) {int cost transactions[i][0];int cas…

案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设

浪潮云洲工业互联网有限公司&#xff08;以下简称为“浪潮云洲”&#xff09;成立于2018年&#xff0c;定位于工业数字基础设施建设商、具有国际影响力的工业互联网平台运营商、生产性互联网头部服务商。截至目前&#xff0c;浪潮云洲工业互联网平台连续五年入选跨行业跨领域工…

C++——动态管理

目录 一、C/C内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 四、operator new与operator delete函数4.1 operator new与operator delete函数 五、new和delete的实现原…

three.js+WebGL踩坑经验合集(4.1):THREE.Line2的射线检测问题(注意本篇说的是Line2,同样也不是阈值方面的问题)

上篇大家消化得如何了&#xff1f; 笔者说过&#xff0c;1级编号不同的两篇博文相对独立&#xff0c;所以这里笔者还是先给出完整代码&#xff0c;哪怕跟&#xff08;3&#xff09;没有太大区别。 这里我们把线的粗细调成5&#xff08;排除难选中的因素&#xff09;&#xff…

Vue2下篇

插槽&#xff1a; 基本插槽&#xff1a; 普通插槽&#xff1a;父组件向子组件传递静态内容。基本插槽只能有一个slot标签&#xff0c;因为这个是默认的位置&#xff0c;所以只能有一个 <!-- ParentComponent.vue --> <template> <ChildComponent> <p>…

【Unity3D】aab包太大无法上传Google问题

目录 一、勾选Split Application Binary&#xff0c;Unity直接打aab包 勾选Split Application Binary选项的影响 不勾选Split Application Binary选项的影响 总结 2、导出Android工程打包aab 一、勾选Split Application Binary&#xff0c;Unity直接打aab包 超出150MB部分…

第6章 数据结构—列表与列表项讲解--总结

整理 野火 《FreeRTOS 内核实现与应用开发实战指南》—基于野火 STM32 全系列&#xff08;M3/4/7&#xff09;开发板 文章目录 第6章 数据结构—列表与列表项讲解--总结6.1 C 语言链表简介6.1.1 单向链表6.1.2 双向链表6.1.3 链表与数组的对比 6.2 FreeRTOS 中链表的实现6.2.1 …

强化学习-Deep Q Network

文章目录 Deep Q Networkzip(*batch)的内部实现假设&#xff1a;结果&#xff1a; Deep Q Network 这种方式很适合格子游戏。因为格子游戏中的每一个格子就是一个状态&#xff0c;这是离散的&#xff0c;但在现实生活中&#xff0c;很多状态并不是离散而是连续的。所以我们可以…

C语言-构造数据类型

1、构造数据类型 结构体、共用体、枚举。 2、结构体 1、结构体的定义 结构体是一个自定义的复合数据类型&#xff0c;它允许将不同类型的数据组合在一起。 struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;数据类型4 成员变量4; } 2、结构体变…

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中的位置&#xff0c;右边代表旋转后的视频在屏幕中的位置。 分屏显示的…

Spark/Kafka

文章目录 项目地址一、Spark1. RDD1.1 五大核心属性1.2 执行原理1.3 四种创建方式二、Kafka2.1 生产者(1)分区器(2)生产者提高吞吐量(3) 生产者数据可靠性数据传递语义幂等性和事务数据有序2.2 Broker(1)Broker工作流程(2)节点服役和退役2.3 副本(1)Follower故障细…

win32汇编环境,函数的编写与调用、传值或返回值等

;运行效果 ;win32汇编环境,函数的编写与调用、传值或返回值等 ;函数在被调用的时候&#xff0c;如果此函数实体在前面&#xff0c;可以不用声明。如果实体在后面&#xff0c;则需要先声明。类似于下面的DlgProc函数&#xff0c;因为它的实体在后面&#xff0c;所以需要在调用之…

[Spring] Gateway详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

回顾2024,展望2025

项目 LMD performance phase2 今年修修补补&#xff0c;设计和做了很多item&#xff0c;有时候自己都数不清做了什么大大小小的item&#xff0c;但是for LMD performance phase2的go-live确实是最大也是最难的了&#xff0c;无论什么系统&#xff0c;只要用的人多了&#xff…