0


RabbitMQ面试整理

1、RabbitMQ有哪些重要的组件?

RabbitMQ的核心组件包括以下几部分,他们共同构成了 RabbitMQ 的基本架构:

(1) Broker:RabbitMQ服务器,负责接收和分发消息的应用。
(2) Virtual Host:虚拟主机,是RabbitMQ中的逻辑容器,用于隔离不同环境或不同应用程序的信息流。每个虚拟主机都有自己的队列、交换机等设置,可以理解为一个独立的RabbitMQ服务。
(3) Connection 连接:管理和维护与RabbitMQ服务器的TCP连接,生产者、消费者通过这个连接和 Broker 建立物理网络连接。
(4) Channel通道:是在Connection 内创建的轻量级通信通道,用于进行消息的传输和交互。应用程序通过Channel进行消息的发送和接收。通常一个 Connection 可以建立多个 Channel。
(5) Exchange交换机:交换机是消息的中转站,负责接收来自生产者的消息,并将其路由到一个或多个队列中。RabbitMQ 提供了多种不同类型的交换机,每种类型的交换机都有不同的消息路由规则。
(6) Queue队列:队列是消息的存储位置。每个队列都有一个唯一的名称。消息从交换机路由到队列,然后等待消费者来获取和处理。
(7) Binding绑定关系: Binding 是 Exchange 和 Queue 之间的关联规则,定义了消息如何从交换机路由到特定的队列。
此外,生产者和消费者也是RabbitMQ的核心组件,生产者负责发送消息到Exchange或者 Queue,消费者负责从Queue中订阅和处理消息。这些核心组件共同构建了 RabbitMQ 的消息传递系统,他们协同工作才能实现消息的可靠传递、路由和业务处理等功能。

2、RabbitMQ中消息基于什么传输?

RabbitMQ使用信道的方式来传输数据。

RabbitMQ的消息传递过程如下:
生产者连接到RabbitMQ服务器,并创建一个通道。
生产者声明一个队列,并将消息发送到队列中。
消费者连接到RabbitMQ服务器,并创建一个通道。
消费者从队列中获取消息,并进行处理。
当消息被消费者处理完毕后,消费者发送确认消息给RabbitMQ服务器。RabbitMQ服务器删除已经确认的消息,并将下一条消息发送给消费者。

3、RabbitMQ有哪些重要角色?

RabbitMQ 中重要的角色有:生产者、消费者和代理:
• 生产者:消息的创建者,负责创建和推送数据到消息服务器;
• 消费者:消息的接收方,用于处理数据和确认消息;
• 代理:就是 RabbitMQ 本身,用于扮演“快递”的角色,本身不生产消息,只是扮演“快递”的角色。

4、RabbitMQ如何保证消息顺序性?

1、单队列(Single Queue)与单消费者(Single Consumer): 如果只有一个生产者向单一队列发送消息,并且这个队列只连接了一个消费者,则RabbitMQ默认情况下就能够保证消息的有序性。因为RabbitMQ会按照消息到达队列的顺序进行存储,并且当消费者开始消费时,也会按照队列中消息的FIFO(先进先出)原则来处理。
2、消息发布顺序控制: 在多生产者场景下,若要保证消息有序,必须确保消息按特定顺序进入队列,例如,确保所有生产者都在同一RabbitMQ节点上发布消息,避免因网络延迟或分布式系统不确定因素造成的消息乱序。
3、持久化与事务: 使用持久化消息可以确保在RabbitMQ服务器重启后,消息依然保持原有的顺序。另外,开启消息发布事务(Publisher Confirms or Transactions)可以确保消息被正确写入队列后再返回确认,但这会降低性能。
4、避免多消费者问题: 对于单个队列,如果有多个消费者同时消费,不能保证消息的全局有序性。为了解决这个问题,可以限制队列仅有一个消费者(独占模式),或者将消息拆分到多个队列(每个队列对应一个消费者),每个队列内的消息有序,从而间接保证整体上的有序性。
5、使用Priority Queue: RabbitMQ也提供了优先级队列,允许基于消息优先级进行排序,但这并不能保证消息严格按照发布顺序消费,而是按照优先级高低顺序。
6、设计模式优化: 有时可以通过业务逻辑设计,比如将关联性强、顺序要求严格的消息放到同一个队列里,而那些相对独立的消息则放在不同的队列中,通过这种方式也能达到部分消息的有序性要求。

5、RabbitMQ有几种广播类型?或者说RabbitMQ交换器类型有哪些?

direct(默认方式):最基础最简单的模式,发送方把消息发送给订阅方,如果有多个订阅者,默认采取轮询的方式进行消息发送。
headers:与 direct 类似,只是性能很差,此类型几乎用不到。
fanout:分发模式,把消费分发给所有订阅者。
topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收到。

6、RabbitMQ如何解决丢数据的问题?

(1)针对身生产者丢失消息:
通过事务机制实现(同步的,不推荐)
通过发送方确认机制实现(异步的,推荐)
(2)Exchange路由到队列失败:
消息无法根据RoutingKey到达对应的Queue中,那么我们的消息最后就会丢失。
对于这种情况,RabbitMQ中在发送消息时提供了mandatory参数。如果mandatory为true时,Exchange根据自身的类型和RoutingKey无法找到对应的Queue,它将不会丢掉该消息,而是会将消息返回给生产者,
在我们调用BasicPublish方法的时候,我们设置了mandatory为true,同时还给channel设置了ReturnListener用来监听路由到队列失败的消息。
(3) RabbitMq自身问题导致的消息丢失问题解决方案
消息持久化:RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失,所以就要对消息进行持久化处理。
设置集群镜像模式:为什么设置镜像模式集群,因为队列的内容仅仅存在某一个节点上面,不会存在所有节点上面,所有节点仅仅存放消息结构和元数据,
如果想解决上面途中问题,保证消息不丢失,需要采用HA 镜像模式队列。
(4)消息补偿机制
我们可以让生产端首先将业务数据以及消息数据入库,需要在同一个事务中,消息数据入库失败,则整体回滚。
消息表的主键:消息id ,消息状态,重试次数,创建时间,然后我们根据消息表中消息状态,失败则进行消息补偿措施,重新发送消息处理
(5)消费者获取消息后处理消息失败:
可以通过ACK确认机制去避免这种情况。在生产者发送消息到RabbitMQ时我们可以通过ack来确认消息是否到达了服务端,与之类似的是,消费者在消费消息时同样提供手动ack模式。默认情况下,消费者从队列中获取消息后会自动ack,我们可以通过手动ack来保证消费者主动的控制ack行为,这样我们可以避免业务异常导致消息丢失的情况。

7、RabbitMQ实现消息持久化需要满足哪些条件?
声明队列必须设置持久化 durable 设置为 true.
消息推送投递模式必须设置持久化,deliveryMode 设置为 2(持久)。
消息已经到达持久化交换器。
消息已经到达持久化队列。
以上四个条件都满足才能保证消息持久化成功。

8、RabbitMQ如何确保每个消息能被消费?

开启生产者确认机制,确保生产者的消息能到达队列
开启持久化功能,确保消息未消费前在队列中不会丢失
开启消费者确认机制为auto,由spring确认消息处理成功后完成ack
开启消费者失败重试机制,并设置MessageRecoverer,多次重试失败后将消息投递到异常交换机,交由人工处理

9、如何保证RabbitMQ消息队列的高可用?

RabbitMQ基于主从模式实现高可用。RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式。
普通集群模式就是在多台机器上启动多个rabbitmq实例,每个机器启动一个。但是创建的queue只会放在一个rabbitmq实例上面,但是其他的实例都同步了这个queue的元数据。在你消费的时候,如果连接到了另一个实例,他会从拥有queue的那个实例获取消息然后再返回给你。
镜像集群模式
这种模式,才是rabbitmq提供是真正的高可用模式,跟普通集群不一样的是,你创建的queue,无论元数据还是queue里面是消息数据都存在多个实例当中,然后每次写消息到queue的时候,都会自动把消息到多个queue里进行消息同步。

10、 vhost 的作用是什么?

在RabbitMQ中,vhost(虚拟主机)是一种逻辑隔离机制,用于将消息队列和相关资源隔离开来。虚拟主机允许您在单个RabbitMQ服务器上创建多个独立的消息队列环境,每个环境都有自己的队列、交换机、绑定和权限设置。

11、 RabbitMQ节点的类型有哪些?
磁盘节点:消息会存储到磁盘。
内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类

12、RabbitMQ集群搭建需要注意哪些问题?

各节点之间使用“--link”连接,此属性不能忽略。
各节点使用的 erlang cookie 值必须相同,此值相当于“秘钥”的功能,用于各节点的认证。
整个集群中必须包含一个磁盘节点。

13、RabbitMQ每个节点是其他节点的完整拷贝吗?为什么?

不是,原因有以下两个:
存储空间的考虑:如果每个节点都拥有所有队列的完全拷贝,
这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据;
性能的考虑:如果每条消息都需要完整拷贝到每一个集群节点,
那新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟。

14、RabbitMQ集群中唯一一个磁盘节点崩溃了会发生什么情况?

不能创建队列
不能创建交换器
不能创建绑定
不能添加用户
不能更改权限
不能添加和删除集群节点
唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西。

15、RabbitMQ对集群节点停止顺序有要求吗?

应该先关闭内存节点,最后再关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。
16、RabbitMQ接收到消息后必须消费吗?

RabbitMQ接收到消息后可以不消费,在消息确认消费之前,可以做以下两件事:
拒绝消息消费,使用channel.basicReject(消息编号, true) 方法,消息会被分配给其他订阅者;
设置为死信队列,死信队列是用于专门存放被拒绝的消息队列。

17. RabbitMQ 事务在什么情况下是无效的?

RabbitMQ的事务在autoAck=true也就是自动消费确认的时候,事务是无效的。

这是因为如果是自动消费确认,RabbitMQ会直接把消息从队列中移除,即使后面事务回滚也不能起到任何作用。


本文转载自: https://blog.csdn.net/arvin79/article/details/141108696
版权归原作者 问不倒呀 所有, 如有侵权,请联系我们删除。

“RabbitMQ面试整理”的评论:

还没有评论