精心整理14道高频消息队列场景面试题(建议收藏)

article/2025/9/18 15:42:42

消息队列是大型系统中常用的一个组件,也是项目的亮点和面试的重点。常见的的分布式系统中有RabbitMQ、ActiveMQ、RocketMQ等,而在大数据项目中比较常用的是Kafka。今天我整理了几道在面试中常见的消息队列面试题,供大家学习参考。

1、消息队列的基本作用?

消息队列的主要作用是:解耦、异步、削峰。

  • 解耦

A 系统通过接口调用发送数据到 B、C、D 三个系统。那如果现在 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?现在 A 系统又要发送第二种数据了呢?这样的话 A 系统的维护成本就非常的高,而且 A 系统要时时刻刻考虑B、C、D、E 四个系统如果出现故障该怎么办?A 系统是重发还是先把消息保存起来呢?使用消息队列就可以解决这个问题。A 系统只负责生产数据,不需要考虑消息被哪个系统来消费。

  • 异步

A 系统需要发送个请求给 B 系统处理,由于 B 系统需要查询数据库花费时间较长,以至于 A 系统要等待 B 系统处理完毕后再发送下个请求,造成 A 系统资源浪费。使用消息队列后,A 系统生产完消息后直接丢进消息队列,不用等待 B 系统的结果,直接继续去干自己的事情了。

  • 削峰

A 系统调用 B 系统处理数据,每天 0 点到 12 点,A 系统风平浪静,每秒并发请求数量就 100 个。结果每次一到 12 点 ~ 13 点,每秒并发请求数量突然会暴增到 1 万条。但是 B 系统最大的处理能力就只能是每秒钟处理 1000 个请求,这样系统很容易就会崩掉。这种情况可以引入消息队列,把请求数据先存入消息队列中,消费系统再根据自己的消费能力拉取消费。

2、消息队列的优缺点有哪些?

  • 优点

消息队列的优点就是:解耦、异步、削峰。

  • 缺点

1. 降低系统的可用性:系统引入的外部依赖越多,越容易挂掉;

2. 系统复杂度提高:使用 MQ 后可能需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题;

3. 一致性问题:A 系统处理完了直接返回成功了,但问题是:要是 B、C、D 三个系统那里,B 和 D 两个系统写库成功了,结果 C 系统写库失败了,就造成数据不一致了。

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

根据不同的 MQ 或者你用过的 MQ 进行回答:

  • RabbitMQ:镜像集群模式

RabbitMQ 是基于主从做高可用性的,Rabbitmq有三种模式:单机模式、普通集群模式、镜像集群模式。单机模式一般在生产环境中很少用,普通集群模式只是提高了系统的吞吐量,让集群中多个节点来服务某个 Queue 的读写操作。那么真正实现 RabbitMQ 高可用的是镜像集群模式。

镜像集群模式跟普通集群模式不一样的是,创建的 Queue,无论元数据还是Queue 里的消息都会存在于多个实例上,然后每次你写消息到 Queue 的时候,都会自动和多个实例的 Queue 进行消息同步。这样设计,好处在于:任何一个机器宕机不影响其他机器的使用。坏处在于:1. 性能开销太大:消息同步所有机器,导致网络带宽压力和消耗很重;2. 扩展性差:如果某个 Queue 负载很重,即便加机器,新增的机器也包含了这个 Queue 的所有数据,并没有办法线性扩展你的 Queue。

  • Kafka:partition 和 replica 机制

Kafka 基本架构是多个 broker 组成,每个 broker 是一个节点。创建一个 topic 可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 就放一部分数据,这就是天然的分布式消息队列。就是说一个 topic 的数据,是分散放在多个机器上的,每个机器就放一部分数据。

Kafka 0.8 以前,是没有 HA 机制的,任何一个 broker 宕机了,它的 partition 就没法写也没法读了,没有什么高可用性可言。

Kafka 0.8 以后,提供了 HA 机制,就是 replica 副本机制。每个 partition 的数据都会同步到其他机器上,形成自己的多个 replica 副本。然后所有 replica 会选举一个 leader 出来,生产和消费都跟这个 leader 打交道,然后其他 replica 就是 follower。写的时候,leader 会负责把数据同步到所有 follower 上去,读的时候就直接读 leader 上数据即可。Kafka 会均匀的将一个 partition 的所有 replica 分布在不同的机器上,这样才可以提高容错性。

4、如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

要保证消息不被重复消费,其实就是要保证消息消费时的幂等性。幂等性:无论你重复请求多少次,得到的结果都是一样的。例如:一条数据重复出现两次,数据库里就只有一条数据,这就保证了系统的幂等性。

  • 那么如何保证幂等性呢?

1. 写数据时,先根据主键查一下这条数据是否存在,如果已经存在则 update;

2. 数据库的唯一键约束也可以保证不会重复插入多条,因为重复插入多条只会报错,不会导致数据库中出现脏数据;

3. 如果是写 redis,就没有问题,因为 set 操作是天然幂等性的。

5、如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

  • RabbitMQ

640?wx_fmt=png

  • Kafka

640?wx_fmt=png


6、如何保证消息的顺序性?

  • RabbitMQ

拆分多个 Queue,每个 Queue一个 Consumer,就是多一些 Queue 而已,确实是麻烦点;或者就一个 Queue 但是对应一个 Consumer,然后这个 Consumer 内部用内存队列做排队,然后分发给底层不同的 Worker 来处理。

  • Kafka

1. 一个 Topic,一个 Partition,一个 Consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。

2. 写 N 个内存 Queue,具有相同 key 的数据都到同一个内存 Queue;然后对于 N 个线程,每个线程分别消费一个内存 Queue 即可,这样就能保证顺序性。

7、大量消息在 MQ 里长时间积压,该如何解决?

  • https://www.jianshu.com/p/5f4b3a520719

一般这个时候,只能临时紧急扩容了,具体操作步骤和思路如下:

1. 先修复 consumer 的问题,确保其恢复消费速度,然后将现有 consumer 都停掉;

2. 新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量;

3. 然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue;

4. 接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据;

5. 等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。

8、MQ 中的消息过期失效了怎么办?

  • https://www.jianshu.com/p/5f4b3a520719

假设你用的是 RabbitMQ,RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在 Queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉,这个数据就没了。这时的问题就不是数据会大量积压在 MQ 里,而是大量的数据会直接搞丢。这个情况下,就不是说要增加 Consumer 消费积压的消息,因为实际上没啥积压,而是丢了大量的消息。

我们可以采取一个方案,就是批量重导。就是大量积压的时候,直接丢弃数据了,然后等过了高峰期以后开始写程序,将丢失的那批数据一点一点的查出来,然后重新灌入 MQ 里面去,把丢的数据给补回来。

9、RabbitMQ 有哪些重要的角色?

RabbitMQ 中重要的角色有:生产者、消费者和代理。

1. 生产者:消息的创建者,负责创建和推送数据到消息服务器;

2. 消费者:消息的接收方,用于处理数据和确认消息;

3. 代理:就是 RabbitMQ 本身,用于扮演“快递”的角色,本身不生产消息,只是扮演“快递”的角色。

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

1. ConnectionFactory(连接管理器):应用程序与 rabbit 之间建立连接的管理器,程序代码中使用;

2. Channel(信道):消息推送使用的通道;

3. Exchange(交换器):用于接受、分配消息;

4. Queue(队列):用于存储生产者的消息;

5. RoutingKey(路由键):用于把生成者的数据分配到交换器上;

6. BindingKey(绑定键):用于把交换器的消息绑定到队列上。

11、RabbitMQ 有几种广播类型?

RabbitMQ 有三种广播模式:fanout、direct、topic。

1. fanout:所有 bind 到此 exchange 的 queue 都可以接收消息;很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 交换机转发消息是最快的。 

2. direct:通过 routingKey 和 exchange 中的 bindingKey 决定的那个唯一的 queue 可以接收消息;

3. topic:所有符合 routingKey 所 bind 的 queue 可以接收消息。

12、Kafka 可以脱离 zookeeper 单独使用吗?为什么?

Kafka 不能脱离 zookeeper 单独使用,因为 Kafka 使用 zookeeper 管理和协调 Kafka 的节点服务器。

13、Kafka 有几种数据保留的策略?

Kafka 有两种数据保存策略:按照过期时间保留和按照存储的消息大小保留。

14、Kafka 的分区策略有哪些?

所谓分区策略就是决定生产者将消息发送到哪个分区的算法。

1. 轮询策略:默认的分区策略,非常优秀的负载均衡表现,它总是能保证消息最大限度地被平均分配到所有分区上;

2. 随机策略:实现随机策略版的 partition 方法;

3. 按消息键保序策略:也称 Key-Ordering 策略,可以保证同一个 Key 的所有消息都进入到相同的分区里,由于每个分区下的消息处理是有顺序的,所以称之为消息键保序策略;

4. 自定义分区策略:在编写生产者程序时,你可以编写一个具体的类实现org.apache.kafka.clients.producer.Partitioner 接口。这个接口也很简单,只定义了两个方法:partition() 和 close(),通常只用实现 partition() 方法即可。同时还需要设置 partitioner.class 参数为你自己实现类的全限定类名。

---end---

推荐阅读:



扫描下方二维码

添加好友,备注【交流群

拉你到学习路线和资源丰富的交流群

640?wx_fmt=png


http://chatgpt.dhexx.cn/article/iPYlpgeg.shtml

相关文章

消息队列面试题(2022最新整理)

为什么要使用消息队列? 总结一下,主要三点原因:解耦、异步、削峰。 1、解耦。比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单操…

浙大Python 第2章-9 比较大小 (10 分)

专题博客链接 [题解]浙大Python PTA课后习题博客记录(Python) 原题题目 代码实现(输出法1) a,b,c map(int,input().split()) temp [a,b,c] list.sort(temp) print("%d->%d->%d" % (temp[0],temp[1],temp[2]))代码实现(输…

Anagrams by Stack | Python 实现

目录 1.题面 2.注意事项: 0.OJ平台 1.无限流输入 、EOF输入流 2.返回中的空格 3.AC代码 1.题面 Anagrams by Stack Time Limit: 2000 msMemory Limit: 65536 KB How can anagrams result from sequences of stack operations? There are two sequences of sta…

用Python统计字符串个数

1.题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 2.程序分析 利用while语句,条件为输入的字符不为’\n’. from pip._vendor.distlib.compat import raw_inputs raw_input(请输入字符串:\n) letters 0 space 0 digit 0 others …

PTA-MOOC《Python程序设计浙江大学》拼题题目集第一章编程题

7-1 从键盘输入两个数,求它们的和并输出 (30分) ****本题目要求读入2个整数A和B,然后输出它们的和。 输入格式: 在一行中给出一个被加数 在另一行中给出一个加数 输出格式: 在一行中输出和值。 输入样例: 在这里给出一组输入。例如: 输出样…

【Python】找出不是公共的元素

目录 找出不是公共的元素 代码思路仅供参考,欢迎大家批评指正! 找出不是公共的元素 给定两行输入,每行代表一组元素。每行的元素间用空格分开。求两组中非公共的元素。 # By jurio. a[i for i in input().split()] b[i for i in input().spl…

【PTA】【Python】【拼题A 2022 跨年挑战赛】小孩子才做选择,大人全都要

阿汪面前有两只盲盒,每只盒子打开都有两种可能:或者装了 X 克狗粮,或者是一只容量为 Y 克的狗粮储蓄盒。如果是狗粮,阿汪可以快乐地吃掉;如果是空储蓄盒,那就倒霉了,阿汪必须想办法找到狗粮把这…

【PTA】【Python】【拼题A 2022 跨年挑战赛】太神奇了

“告诉大家一个神奇的消息,太神奇了:明年全世界所有的人都同岁,全部都等于2022。明年的日子很特别,大概每1000年才会有一次。明年你的周岁年龄你的出生年,每个人都是2022年。例如:你明年57加上1965年生的&a…

LeetCode100题之—3、一汉明距离(python)

汉明距离 题目描述解题思路自己写的答案,不便捷1)利用循环2)利用右移别人给的高效答案 题目描述 解题思路 自己写的答案,不便捷 1)利用循环 分为两个步骤 主要求出两个数二进制形式上下对应时不相同的个数 1&#x…

PTA-MOOC《Python程序设计浙江大学》拼题A题目集第二章编程题

7-1 计算 111213…m (30分) 输入一个正整数m(20<m<100)&#xff0c;计算 111213…m 的值。 输入格式: 在一行输入一个正整数m。 输出格式: 在一行中按照格式“sum S”输出对应的和S. 输入样例: 在这里给出一组输入。例如&#xff1a; 输出样例: 在这里给出相应的输…

PTA-MOOC《Python程序设计浙江大学》拼题题目集第五章编程题题目及代码答案

7-1 输出星期名缩写 (70分) 输入一个1到7的数字&#xff0c;输出对应的星期名的缩写。 1 Mon 2 Tue 3 Wed 4 Thu 5 Fri 6 Sat 7 Sun 输入格式: 输入1到7之间数字 输出格式: 输出对应的星期名的缩写 输入样例: 在这里给出一组输入。例如&#xff1a; 1输出样例: 在这里给出…

菜鸟实战UML——类图

类图 类图(Class diagram)&#xff1a;是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模&#xff0c;也用于详细建模&…

记录一个IT菜鸟的成长之路。

会 的 真 的 会 的 所 有 离 开 的 人 都 信 誓 旦 旦 地 说 过 他 们 不 会 忘 记 曾 经 的 一 切 可 是 最 后 都 忘 了 无 一 例 外 地 忘 记 了 他 们 会 开 始 熟 悉 每 一 条 陌 生 的 路 听 每 一 首 陌 生 的 歌 会 知 道 在 哪 一 个 街 角 有 超 市 可 以 买…

SpringBoot使用菜鸟物流云打印电子面单

菜鸟物流云属于淘宝开放平台的一部分&#xff0c;淘宝开发平台提供了很多种对接接口&#xff0c;包括商品、销售单等等&#xff0c;几乎涉及到的业务都在该平台上开放了接口。 淘宝开放平台提供了两种快递面单接口&#xff0c;一种是淘宝商家TOP接口&#xff0c;一种是菜鸟物流…

菜鸟学设计模式——小单例有大秘密

欢迎大家关注我的新书《Spring Boot趣味实战课》 京东 当当 天猫 单例模式大家并不陌生&#xff0c;也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗&#xff1f;今天我带大家一起来看看我眼中的单例&#xff0c;可能会跟你的认识有所不同。 下面是…

项目菜鸟成长为老鸟之路

【背景】 从去年12月份开始加入廊坊市市委组织部考核系统的维护,到今天正式验收完重构文档,算是一个项目的完美阶段性结项。 维护工作(纯三层架构)——》重构阶段性完结(MVCWCFEF映射架构)&#xff0c;它经历了历史的变革。 项目菜鸟(刚入维护)——》中级老鸟(重构完结…

菜鸟驿站进军万亿社区市场

文&#xff5c;祝颖丽 编辑&#xff5c;斯问 “老板娘&#xff0c;取一下快递。”“取件码多少&#xff1f;” “老板娘&#xff0c;我的紫甘蓝到了吗&#xff1f;”“在后面货架上。” “老板娘&#xff0c;团购的东西总共多少钱&#xff1f;” “480。” 6月23日&#xff0c;…

《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

欢迎关注微信账号&#xff1a;java那些事&#xff1a;csh624366188.每天一篇java相关的文章 在众多朋友的支持和鼓励下&#xff0c;《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中&#xff0c;难…

“菜鸟”程序员和“大神”程序员差距在哪里

点击上方“程序员大咖”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 刚刚走出就业的程序员&#xff0c;技术是刚刚起步的基点。那下面我们就聊一聊有关技术的东西。首先请您先想想这几个问题。现在社会上有很多程序员&#xff0c;那您是否可…

Java程序员从笨鸟到菜鸟全部博客目录

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 欢迎关注微信账号&#xff1a;java那些事&#xff1a;csh624366188.每天一篇java相关的文章 大学上了一年半&#xff0c;接触java也一年半了&#xff0c;虽然中间也有其他东…