RabbitMq相关面试题

Rabbitmq:

1.什么是RabbitMQ?它的作用是什么?

消息中间件实现各个应用程序之间的异步通信和解耦

作用:异步通信和解耦、缓冲和削峰填谷、可靠性(RabbitMQ支持消息持久化、消息确认机制)

2.RabbitMQ的基本架构是怎样的?

生产者将消息发送到Exchange(Direct Exchange、Fanout Exchange、Topic Exchange、Headers Exchange),Exchange根据路由规则将消息发送到队列(队列可以持久化,确保消息在RabbitMQ重启后不会丢失。)中,消费者从队列中获取消息进行消费。

3.RabbitMQ中的重要概念有哪些?比如Exchange、Queue、Routing Key等。

Exchange(交换机):Exchange是消息的路由中心,负责接收生产者发送的消息,并根据路由规则将消息路由到一个或多个队列中。Exchange有几种类型,包括Direct Exchange、Fanout Exchange、Topic Exchange、Headers Exchange等。

Queue(队列):队列是消息的存储区,消息最终存储在队列中等待消费者消费。消费者从队列中获取消息并处理。队列可以持久化,确保消息在RabbitMQ重启后不会丢失。

Binding(绑定):绑定是Exchange和Queue之间的关联关系,指定了消息从Exchange到达Queue的路由规则。Exchange通过Binding将消息路由到相应的Queue中。

Routing Key(路由键):Routing Key是生产者在发送消息时附加的关键字,Exchange根据Routing Key将消息路由到相应的Queue中。

Producer(生产者):生产者负责向RabbitMQ发送消息,将消息发送到Exchange中。

Consumer(消费者):消费者从队列中获取消息,并进行相应的处理。消费者可以订阅一个或多个队列,从中获取消息并进行消费。

Connection(连接):连接是生产者或消费者与RabbitMQ Broker之间的连接,通过连接可以进行消息的发送和接收。

Channel(通道):通道是在连接上创建的虚拟连接,通过通道可以进行消息的发送、接收和确认,一个连接可以创建多个通道。

Message(消息):消息是生产者发送的数据单元,包含消息体和一些元数据,如Routing Key、Exchange等。

4.RabbitMQ中的消息确认机制是什么?有哪几种确认模式?

生产者确认模式(Publisher Confirms):在生产者发送消息到RabbitMQ后,可以通过确认机制来确保消息已经被正确地发送到Broker。生产者可以选择同步方式或异步方式来进行确认。同步方式是在发送消息后等待Broker的确认,异步方式是通过回调函数来处理确认结果。生产者确认模式可以保证消息的可靠发送。

消费者确认模式(Consumer Acknowledgements):在消费者从队列中获取消息并处理后,可以通过确认机制来告知Broker消息已经被正确地处理。消费者可以选择手动确认模式或自动确认模式。手动确认模式需要消费者显式地发送确认消息给Broker,告知消息已经被处理;自动确认模式则由RabbitMQ自动确认消息。消费者确认模式可以保证消息的可靠消费。

5.RabbitMQ如何处理消息的持久化?

队列持久化:在声明队列时,可以设置队列的持久化属性,使得队列在RabbitMQ服务器重启后不会丢失。当队列被声明为持久化时,RabbitMQ会将队列的元数据(如队列的名称、绑定、属性等)保存到磁盘上,确保队列的持久性。

消息持久化:在生产者发送消息时,可以设置消息的持久化属性,使得消息在被发送到队列后不会丢失。当消息被声明为持久化时,RabbitMQ会将消息保存到磁盘上,以确保消息在RabbitMQ服务器重启后不会丢失。

消息确认机制:通过消息确认机制,可以确保消息在发送和消费过程中的可靠传递。生产者可以通过生产者确认模式来确认消息是否已经成功发送到Broker,消费者可以通过消费者确认模式来确认消息是否已经成功消费。这可以确保消息的可靠性。

6.RabbitMQ中的消息传递模式有哪些?分别是什么?

点对点模式(Point-to-Point):在点对点模式下,消息发送者(生产者)将消息发送到一个特定的队列,只有一个消费者可以从该队列中接收并处理消息。这种模式适用于一对一的消息传递场景,确保消息被唯一的消费者接收。

发布/订阅模式(Publish/Subscribe):在发布/订阅模式下,消息发送者(生产者)将消息发送到一个交换机(Exchange),交换机将消息路由到多个队列,每个队列对应一个消费者。消费者可以订阅一个或多个队列,从而接收并处理相应的消息。这种模式适用于一对多的消息传递场景,支持消息广播。

主题模式(Topic):主题模式是发布/订阅模式的一种变体,消息发送者(生产者)将消息发送到一个主题交换机(Topic Exchange),交换机根据消息的Routing Key将消息路由到一个或多个队列,消费者可以根据通配符的Routing Key来订阅感兴趣的消息。主题模式支持更灵活的消息路由规则,可以根据消息的特定属性来进行消息路由。

工作队列模式(Work Queues):工作队列模式也称为任务队列模式,多个消费者共享同一个队列,消费者从队列中获取消息并处理。这种模式适用于任务分发和负载均衡的场景,多个消费者可以并行处理消息,提高系统的吞吐量和处理能力。

7.RabbitMQ如何处理消息的路由?

Direct Exchange:直接交换机根据消息的Routing Key将消息直接路由到与之匹配的队列。生产者发送消息时需要指定一个Routing Key,Exchange会根据消息的Routing Key将消息路由到与之匹配的队列中。

Fanout Exchange:扇出交换机会将消息路由到所有与之绑定的队列中,无论消息的Routing Key是什么。Fanout Exchange适用于消息广播的场景,消息会被所有订阅了该Exchange的队列接收。

Topic Exchange:主题交换机根据消息的Routing Key和Exchange与队列的绑定规则将消息路由到一个或多个队列中。主题交换机支持通配符的Routing Key匹配,可以根据消息的特定属性来进行消息路由。

Headers Exchange:头交换机根据消息的Header属性来进行路由,而不是根据Routing Key。通过匹配消息的Header属性,头交换机可以将消息路由到与之匹配的队列中。

8.RabbitMQ如何处理消息的消费者负载均衡?

工作队列模式(Work Queues):在工作队列模式中,多个消费者共享同一个队列,消费者可以并行地从队列中获取消息并处理。RabbitMQ会将消息均匀地分发给多个消费者,以实现消费者之间的负载均衡。消费者可以通过设置预取值(prefetch count)来控制每次从队列中获取的消息数量,以避免某个消费者处理过多的消息。

发布/订阅模式(Publish/Subscribe):在发布/订阅模式中,多个消费者可以订阅同一个交换机,并从交换机接收消息。通过创建多个队列并将其绑定到同一个交换机上,可以实现消息的负载均衡。交换机会将消息广播到所有订阅的队列中,确保消息被多个消费者接收并处理。

消费者组(Consumer Groups):RabbitMQ支持消费者组的概念,可以将多个消费者组织成一个消费者组,每个消费者组内的消费者共享一个队列。消费者组内的消费者可以并行地处理队列中的消息,实现消息的负载均衡。通过合理地设置消费者组的数量和消费者数量,可以有效地分配消息处理的负载。

9.RabbitMQ如何处理消息的延迟发送?

使用TTL(Time-To-Live):可以通过设置消息的TTL来实现消息的延迟发送。在发送消息时,可以设置消息的过期时间,当消息在队列中等待消费时,如果消息的过期时间到达,则消息会被丢弃或者进入死信队列。通过合理设置消息的TTL,可以实现消息的延迟发送效果。

使用延迟队列:可以通过创建一个专门用于延迟发送消息的队列来实现消息的延迟发送。生产者将需要延迟发送的消息发送到延迟队列中,然后通过设置队列的TTL或者使用定时器等方式来触发消息的转发到实际的目标队列。这种方式可以灵活地控制消息的延迟发送时间。

使用插件或者第三方库:有一些RabbitMQ的插件或者第三方库可以实现消息的延迟发送功能,例如RabbitMQ Delayed Message Plugin、RabbitMQ Delayed Message Exchange等。这些插件或者库可以提供更加方便和高效的延迟发送功能,可以根据需求选择合适的插件或者库来实现消息的延迟发送。

10.RabbitMQ和其他消息队列系统(如Kafka、ActiveMQ等)有什么区别?

消息传递模型:

1.RabbitMQ:采用AMQP(高级消息队列协议)作为消息传递模型,支持多种消息传递方式,如点对点、发布/订阅等。

2.Kafka:采用发布/订阅模型,主要用于实时流数据处理,支持高吞吐量的消息传递。

3.ActiveMQ:支持多种消息传递模型,包括点对点和发布/订阅,可以根据需求选择不同的消息传递方式。

存储机制:

1.RabbitMQ:消息存储在内存中,可以持久化到磁盘,适用于短期存储和低延迟的场景。

2.Kafka:消息以日志文件的形式存储在磁盘上,适用于大规模数据处理和实时数据流处理。

3.ActiveMQ:支持消息存储在内存或者数据库中,可以根据需求选择不同的存储方式。

消息顺序保证:

1.RabbitMQ:可以保证消息的顺序性,即消息按照发送顺序被消费。

2.Kafka:可以保证分区内消息的顺序性,但不保证整个主题的消息顺序。

3.ActiveMQ:可以保证消息的顺序性,即消息按照发送顺序被消费。

水平扩展性:

1.RabbitMQ:支持水平扩展,可以通过集群方式实现高可用和高吞吐量。

2.Kafka:天生支持水平扩展,可以通过分区和副本机制实现高可用和高吞吐量。

3.ActiveMQ:支持集群方式实现高可用和高吞吐量,但相对于Kafka和RabbitMQ来说扩展性略逊色。

适用场景:

1.RabbitMQ:适用于需要保证消息顺序性和低延迟的场景,如任务队列、通知系统等。

2.Kafka:适用于大规模数据处理、实时数据流处理等场景。

3.ActiveMQ:适用于企业应用集成、消息中间件等场景。

总的来说,RabbitMQ适用于需要保证消息顺序性和低延迟的场景,Kafka适用于大规模数据处理和实时数据流处理,ActiveMQ适用于企业应用集成等场景。根据具体的需求和场景特点,选择适合的消息队列系统是非常重要的。

相关推荐
用户8307196840821 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者2 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者4 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧5 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖5 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农5 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者6 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀6 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3056 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05096 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式