消息队列RabbitMQ的常见面试题目

简介: 什么是RabbitMQ使用AMQP高级队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦

什么是RabbitMQ


使用AMQP高级队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦


什么是AMQP


AMQP(Advanced Message Queuing Protocol)高级消息队列协议,一个提供统一消息服务的应用层标准协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP是一个进程间传递异步消息的网络协议。

基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。


为什么要使用RabbitMQ(优点)


异步:主流程只需要完成业务的核心功能;对于业务非核心功能将消息放入消息队列之中进行异步处理,减少请求的等待,提高系统的总体性能

解耦:将系统按照不同的业务功能来拆分出来,消费生产者只管把消息发布到MQ中而不用管谁来取,消息消费者只管从MQ中取消息而不管是谁发布的,消息生产者和消费者都不知道对方的存在

削峰/限流:将所有的请求都写到消息队列中,消费服务器按照自身能够处理的请求数从队列中拿到请求,防止请求并发过高将系统搞崩溃



RabbitMQ的缺点


系统的可用性降低: 系统引用的外部依赖越多,越容易挂掉,如果MQ服务器挂掉,那么可能导致整套系统崩溃

系统的复杂度提高: 加入消息队列之后,需要保证消息没有重复消费、如果处理消息丢失、有序性等问题

数据一致性问题: A系统处理完直接返回成功,使用者都以为你这个请求就成功了但是问题是,要是BCD系统哪里,BD系统写库成功了,结果C系统写库失败了,就会导致数据不一致


e38265df5f204421a3e20afd8e45dd46.jpeg

Publisher:生产者

Consumer:消费者

Broker:表示消息队列的服务器实体

Queue:消息队列,用于存放消息

Exchange:交换器,接受生产者发送的消息,根据路由键路由到指定的队列

Routing Key:路由关键字,用于指定这个消息的路由规则,需要与交换机类型和绑定键(binding-key)联合使用

Binding:绑定,通过绑定将交换机和队列关联起来,一般会指定一个bind-key,通过bind-key交换机就知道将消息路由给那个队列了

Connection:网络连接,用来连接到broker

Channel:信道,AMQP命令都是在信道中进行的,不管是发布消息、订阅队列还是接受消息。因为建立和消耗TCP都是非常昂贵的开销,所有引入信道的概念复用一条TCP连接

Message:消息,由消息头和消息体组成,消息头属性包括路由键,优先级等

Virtual host:虚拟主机,用于逻辑隔离,表示一批独立的交换器、消息队列和相关对象


生产者生产消息的过程


1、producer先连接到Broker,建立Connection,开启一个信道

2、Producer 声明一个交换机设置好属性

3、Producer 声明一个队列设置好属性

4、Producer 通过绑定建将交换器和队列绑定起来

5、Producer 发送消息到Broker,其中包含路由建、交换器等信息

6、交换机通过路由键查找匹配的队列

7、如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者

8、关闭信道


消费者接受消息过程


1、推模式

推模式接收消息是最有效的一种消息处理方式,当消息到达RabbitMQ时候,RabbitMQ会自动地、不断地投递消息给匹配的i消费者,不需要消费端手动来拉取,推模式将消息提前推送给消费者,消费者必须设置一个缓冲区缓存这些消息

优点

消息者总是有一堆在内存中待处理的消息,所以效率比较高

由于推模式的信息到达就给匹配的消费者所以实时性比较好,消费者能及时得到最新的消息

缺点

缓存区可能会溢出


2、拉模式

拉模式在消费者需要时才去消息中间件拉取消息

缺点

会增加消息延迟,降低系统吞吐量,由于拉模式需要消费者手动去RabbitMQ中拉取消息,所以实时性不高


如何保证消息不丢失,进行可靠传输


RabbitMQ提供事务机制确认机制两种模式来确保生产者不丢失消息


事务机制


发送消息前,开启事务,然后发送消息,如果发送过程中出现异常,事务就会回滚,如果成功就提交事务

缺点

生产者发送消息会同步阻塞等待发送结果是成功还是失败,导致生产者发送消息吞吐量降低


确认机制


生产者将信道设置为confirm模式,一旦channel进入confirm模式,所以在该信道上发布的消息都会被指派一个ID,消息被broker接收到就会执行confirmCallback,如果是集群,需要所有的都收到才会调用confirmCallback,被broker接收到只能表示meaasge到达服务器,不能保证到达了queue。


如果没有未能投递到目标queue里将调用returnCall,记录下数据,定期巡查和纠错


消费者获取到数据,成功处理返回ack。

但是默认是自动确认消息模式,当消费者还在处理中,消费者就会返回ack,通知RabbitMQ已经收到了消息,然后RabbitMQ就会立即删除,但是如果消息者出现了异常没有处理掉消息就会丢失

所有采用手动确认模式,等到消息被真正消费之后,再发送一个确认信号,即使中途消息没有处理完,但是服务器宕机了,那么RabbitMQ就收不到ack就会继续发送这条消息


如何保证消息不被重复消费


1、改变业务逻辑,使得在重复消费时也不影响结果,例如使用乐观锁加个version字段

2、基于数据库的唯一主键约束。消费完消息后,在数据库中做一个insert操作,如果出现重复消费就会主键冲突

3、记录关键key,当消息过来时候,判断这个key是不是已经被处理过了,如果没处理就再进行下一步


如何保证消息的有序性


1、拆分queue,使得一个queue只对应一个消费者,由于MQ内部一般都能保证内部队列是先进先出的,所有把需要保持先后顺序的一组消息使用某种算法分配到同一个消息队列,然后使用一个消费者去消费该队列,这样就会保证消费者是按照顺序进行消费的,但是吞吐量会出现瓶颈

2、对于多线程消费同一个队列的情况,可以使用重试机制,比如一个操作发帖子,写评论,删除微博,这三个异步操作,如果一个消费者先执行删除微博,但是还没有发就一定会失败,等一段时间后再执行这个操作就行


如何处理消息堆积情况


1、找出该问题的原因

(消费者宕机、消费者能力不足、发送者流量过大、业务逻辑原因)

2、临时扩容

1、先修复消费者问题,确保其恢复消费速度,然后停掉消费者

2、创建原先N倍的queue,然后写一个临时分发数据的消费者程序,将该程序部署上去消费队列中的积压的数据

3、然后使用N倍的机器来部署消费者,每个消费者来消费一个临时queue中的数据

4、等消费完之后,恢复最开始的部署,使用原先的消费者机器


相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6月前
|
消息中间件 数据管理 Serverless
阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025
阿里云消息团队基于 Apache RocketMQ 构建 Serverless 消息系统,适配多种主流消息协议(如 RabbitMQ、MQTT 和 Kafka),成功解决了传统中间件在可伸缩性、成本及元数据管理等方面的难题,并据此实现 ApsaraMQ 全系列产品 Serverless 化,助力企业提效降本。
|
7月前
|
Web App开发 缓存 前端开发
浏览器常见面试题目及详细答案解析
本文围绕浏览器常见面试题及答案展开,深入解析浏览器组成、内核、渲染机制与缓存等核心知识点。内容涵盖浏览器的主要组成部分(如用户界面、呈现引擎、JavaScript解释器等)、主流浏览器内核及其特点、从输入URL到页面呈现的全过程,以及CSS加载对渲染的影响等。结合实际应用场景,帮助读者全面掌握浏览器工作原理,为前端开发和面试提供扎实的知识储备。
323 4
|
4月前
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
331 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
|
8月前
|
消息中间件 架构师 Java
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
|
7月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
420 6
|
7月前
|
算法 Java 关系型数据库
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
183 2
|
7月前
|
安全 Java 编译器
Java 校招面试题目合集及答案 120 道详解
这份资料汇总了120道Java校招面试题目及其详细答案,涵盖Java基础、JVM原理、多线程、数据类型、方法重载与覆盖等多个核心知识点。通过实例代码解析,帮助求职者深入理解Java编程精髓,为校招面试做好充分准备。无论是初学者还是进阶开发者,都能从中受益,提升技术实力和面试成功率。附带的资源链接提供了更多学习材料,助力高效备考。
389 3
|
7月前
|
存储 算法 Java
校招 java 面试基础题目及解析
本文围绕Java校招面试基础题目展开,涵盖平台无关性、面向对象特性(封装、继承、多态)、数据类型、关键字(static、final)、方法相关(重载与覆盖)、流程控制语句、数组与集合、异常处理等核心知识点。通过概念阐述和代码示例,帮助求职者深入理解并掌握Java基础知识,为校招面试做好充分准备。文末还提供了专项练习建议及资源链接,助力提升实战能力。
181 0
|
消息中间件 存储 Java
招行面试:10Wqps场景,RocketMQ 顺序消费 的性能 如何提升 ?
45岁资深架构师尼恩在其读者群中分享了关于如何提升RocketMQ顺序消费性能的高并发面试题解析。面对10W QPS的高并发场景,尼恩详细讲解了RocketMQ的调优策略,包括专用方案如增加ConsumeQueue数量、优化Topic设计等,以及通用方案如硬件配置(CPU、内存、磁盘、网络)、操作系统调优、Broker配置调整、客户端配置优化、JVM调优和监控与日志分析等方面。通过系统化的梳理,帮助读者在面试中充分展示技术实力,获得面试官的认可。相关真题及答案将收录于《尼恩Java面试宝典PDF》V175版本中,助力求职者提高架构、设计和开发水平。
招行面试:10Wqps场景,RocketMQ 顺序消费 的性能 如何提升 ?
|
消息中间件 运维 Java
招行面试:RocketMQ、Kafka、RabbitMQ,如何选型?
45岁资深架构师尼恩针对一线互联网企业面试题,特别是招商银行的高阶Java后端面试题,进行了系统化梳理。本文重点讲解如何根据应用场景选择合适的消息中间件(如RabbitMQ、RocketMQ和Kafka),并对比三者的性能、功能、可靠性和运维复杂度,帮助求职者在面试中充分展示技术实力,实现“offer直提”。此外,尼恩还提供了《尼恩Java面试宝典PDF》等资源,助力求职者提升架构、设计、开发水平,应对高并发、分布式系统的挑战。更多内容及技术圣经系列PDF,请关注【技术自由圈】获取。

相关产品

  • 云消息队列 MQ