RabbitMQ面试题汇总

简介: RabbitMQ面试题汇总

1.RabbitMQ特点

  1. 可靠性: RabbitMQ使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等。
  2. 扩展性: 多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展 集群中节点。
  3. 管理界面 : RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集 群中的节点等。
  4. 插件机制 : RabbitMQ 提供了许多插件 , 以实现从多方面进行扩展,当然也可以编写自己的插件。

2.AMQP是什么?

RabbitMQ就是 AMQP 协议的 Erlang 的实现(当然 RabbitMQ 还支持 STOMP2、 MQTT3 等协议 ) AMQP 的模型架构 和 RabbitMQ 的模型架构是一样的,生产者将消息发送给交换机,交换机和队列进行绑定 。

3.AMQP模型的几大组件?

  1. 交换器 (Exchange):消息代理服务器中用于把消息路由到队列的组件。
  2. 队列 (Queue):用来存储消息的数据结构,位于硬盘或内存中。
  3. 绑定 (Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。

4.说说生产者Producer和消费者Consumer?

  1. 生产者
  • 消息生产者,就是投递消息的一方。
  • 消息一般包含两个部分:消息体(payload)和标签(Label)。
  1. 消费者
  • 消费消息,也就是接收消息的一方。
  • 消费者连接到RabbitMQ服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签。

5.为什么使用MQ?MQ的优点

  1. 异步处理 - 相比于传统的串行、并行方式,提高了系统的吞吐量。
  2. 应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。
  3. 流量削锋 - 可以通过消息队列长度控制请求量,可以缓解短时间内的高并发请求。
  4. 消息通讯 - 消息队列一般都内置了高效的通信机制,因此也可以用在纯消息通讯上。比如实现点对点消息队列,或者聊天室等。
  5. 日志处理 - 解决大量日志传输。

6.说说Broker服务节点、Queue队列、Exchange交换器?

  1. Broker可以看做RabbitMQ的服务节点。一般请下一个Broker可以看做一个RabbitMQ服务器。
  2. Queue:RabbitMQ的内部对象,用于存储消息。多个消费者可以订阅同一队列,这时队列中的消息会被平摊(轮询)给多个消费者进行处理。
  3. Exchange:生产者将消息发送到交换器,由交换器将消息路由到一个或者多个队列中。当路由不到时,或返回给生产者或直接丢弃。

7.你们公司生产环境用的是什么消息中间件?

对不同MQ中间件技术的选型分析。
  1. 比如说ActiveMQ是老牌的消息中间件,国内很多公司过去运用的还是非常广泛的,功能很强大。

但是问题在于ActiveMQ没法支撑互联网公司的高并发、高负载以及高吞吐的复杂场景,现在在国内互联网公司落地较少。

  1. RabbitMQ,
  • 他的好处在于可以支撑高并发、高吞吐量、性能很高,同时有非常完善便捷的后台管理界面可以使用。
  • 另外,他还支持集群化、高可用部署架构、消息高可靠支持,功能较为完善。
  • 而且经过调研,国内各大互联网公司落地RabbitMQ集群支撑自身业务的case较多,国内各种中小型互联网公司使用RabbitMQ的实践也比较多。
  • 除此之外,RabbitMQ的开源社区很活跃,较高频率的版本迭代,来修复发现的bug以及进行各种优化,因此综合考虑过后,公司采取了RabbitMQ。
  1. 然后可以聊聊RocketMQ
  • 是阿里开源的,经过阿里生产环境的超高并发、高吞吐的考验,性能卓越,同时还支持分布式事务等特殊场景。
  • 而且RocketMQ是基于Java语言开发的,适合深入阅读源码,有需要可以站在源码层面解决线上问题,包括源码的二次开发和改造。
  1. 另外就是Kafka。
  • Kafka提供的消息中间件的功能明显较少一些,相对上述几款MQ中间件要少很多。
  • 但是Kafka的优势在于专为超高吞吐量的实时日志采集、实时数据同步、实时数据计算等场景。

8.Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

项目 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 比RabbitMQ低 2.6w/s(消息做持久化) 11.6w/s 17.3w/s
开发语言 Java Erlang Java Scala/Java
主要维护者 Apache Mozilla/Spring Alibaba Apache
成熟度 成熟 成熟 开源版本不够成熟 比较成熟
订阅形式 点对点(p2p)、广播(发布-订阅) 提供了4种:direct, topic ,Headers和fanout。fanout就是广播模式 基于topic/messageTag以及按照消息类型、属性进行正则匹配的发布订阅模式 基于topic以及按照topic进行正则匹配的发布订阅模式
持久化 支持少量堆积 支持少量堆积 支持大量堆积 支持大量堆积
顺序消息 不支持 不支持 支持 支持
性能稳定性 一般 较差
集群方式 支持简单集群模式,比如’主-备’,对高级集群模式支持不好。 支持简单集群,'复制’模式,对高级集群模式支持不好。 常用 多对’Master-Slave’ 模式,开源版本需手动切换Slave变成Maste 天然的‘Leader-Slave’无状态集群,每台服务器既是Master也是Slave
管理界面 一般 较好 一般

9.消息积压怎么处理

消息积压的直接原因,一定是系统中某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压。
  1. 从两个方面开始考虑:
  • 一个是生产者生产的消息过快,导致消费者消费不及时
  • 二是消费者出现异常,导致一直无法接收新的消息
  1. 设置消息过期时间,过期后转入死信队列,写一个程序处理死信消息(重新如队列或者即使处理或记录到数据库延后处理)
  2. 考虑使用队列最大长度限制

10.如何保证RabbitMQ消息的可靠传输?消息丢失怎么办?

丢失又分为:生产者丢失消息、消息列表丢失消息、消费者丢失消息;
  1. 生产者的解决策略
  • 开启事务(同步操作,影响性能,吞吐量下降),发送消息前,开启事务(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()),如果发送成功则提交事务(channel.txCommit())
  • 生产者确认模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就代表成功将消息发送到队列中了;如果rabbitMQ没能处理该消息,则会发送一个Nack消息给你,生产者可以进行重试操作。
  1. 队列的解决策略

处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。
这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个Ack信号。
这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack信号,生产者会自动重发。

  1. 消费者的解决策略

消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息;
如果这时处理消息失败,就会丢失该消息;
解决方案:处理消息成功后,手动回复确认消息

  1. 最终

在这里插入图片描述

11.RabbitMQ 常见工作模式和应用场景

11.1 简单模式

一个生产者,一个消费者。生产者将消息发送到队列,消费者监听消息队列,如果队列中有消息,就进行消费,消费后消息从队列中删除

在这里插入图片描述

11.2 工作模式

原理:一个生产者,多个消费者,一条消息只能被一个消费者消费。生产者将消息发送到消息队列,多个消费者同时监听一个队列,谁先抢到消息谁负责消费。这样就形成了资源竞争,谁的资源空闲大,争抢到的可能性就大。

在这里插入图片描述

11.3 发布订阅模式

一个生产者,多个消费者,每个消费者都可以收到相同的消息。生产者将消息发送到交换机,交换机类型是fanout,不同的队列注册到交换机上,不同的消费者监听不同的队列,所有消费者都会收到消息。

在这里插入图片描述

11.4 路由模式

生产者将消息发送给交换机,消息携带具体的routingkey。交换机类型是direct,交换机匹配与之绑定的队列的routingkey,分发到不同的队列上。

在这里插入图片描述

11.5 主题模式

路由模式的一种,交换机类型是topic,路由功能添加了模糊匹配。星号(*)代表1个单词,#号(#)代表一个或多个单词。

在这里插入图片描述

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
消息中间件 存储 监控
|
4月前
|
消息中间件 存储 负载均衡
RocketMQ 面试题及答案整理,最新面试题
RocketMQ 面试题及答案整理,最新面试题
369 4
|
4月前
|
消息中间件 缓存 NoSQL
RabbitMQ 总结面试
RabbitMQ 总结面试
45 0
|
4月前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
132 2
|
1月前
|
消息中间件 缓存 负载均衡
复盘女朋友面试4个月的RocketMQ面试题
这篇文章复盘了面试中关于RocketMQ的高频题目,包括架构组成、使用姿势、功能原理及高级特性,并强调了理解这些实现机制对于面试成功的重要性。
复盘女朋友面试4个月的RocketMQ面试题
|
2月前
|
消息中间件 Kafka API
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
25 1
|
2月前
|
消息中间件 Kafka
面试题Kafka问题之RabbitMQ的路由配置工作如何解决
面试题Kafka问题之RabbitMQ的路由配置工作如何解决
48 1
|
1月前
|
消息中间件 网络架构
RabbitMQ消息队列常见面试题
这篇文章总结了RabbitMQ的常见面试题,涵盖了消息模型、使用场景、实现功能、消息幂等性、顺序性、堆积和丢失的避免方法,以及推模式和拉模式的区别。
44 0
|
2月前
|
消息中间件 负载均衡 Java
JAVA面试之MQ
JAVA面试之MQ
47 0
|
4月前
|
消息中间件 数据采集 Python
2024年Python最全使用python的pika链接rabbitMq断裂_pika,BTAJ面试有关散列(哈希)表的面试题详解
2024年Python最全使用python的pika链接rabbitMq断裂_pika,BTAJ面试有关散列(哈希)表的面试题详解
2024年Python最全使用python的pika链接rabbitMq断裂_pika,BTAJ面试有关散列(哈希)表的面试题详解