常见消息队列面试题

article/2025/9/18 15:16:26

常见消息队列面试题

1.为什么要用消息队列?(消息队列的应用场景?)

消息队列的本质?

消息队列是一种“先进先出”的数据结构,一般用其作为数据的传递

常见的应用场景:解耦,异步以及削峰

解耦:

场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.
在这里插入图片描述

这种做法有一个缺点:

当库存系统出现故障时,订单就会失败。 订单系统和库存系统高耦合. 引入消息队列

在这里插入图片描述

订单系统: 用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

库存系统订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失.

异步

场景说明: 用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式

串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.

在这里插入图片描述

并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。

在这里插入图片描述

消息队列:假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并行已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回.
消息队列: 引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理

在这里插入图片描述

由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。

削峰

场景:秒杀活动,一般因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。

作用:
1.可以控制活动人数,超过此一定阀值的订单直接丢弃

2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)

在这里插入图片描述

1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.

2.秒杀业务根据消息队列中的请求信息,再做后续处理.

2.各种消息队列产品的比较

# 1.ActiveMQActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。它是一个完全支持JMS规范的的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!# 2.KafkaKafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。# 3.RocketMQRocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。# 4.RabbitMQRabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在,其次,RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

3.消息队列的优点和缺点

缺点:

1)系统可用性降低

外部依赖的系统多了,增加了消息队列系统。

答案 问题4

2)系统复杂度提高

你怎么保证消息没有重复消费?

答案 问题6

怎么处理消息丢失的情况?

答案 问题5

怎么保证消息传递的顺序性?

答案 问题7

3)一致性问题

数据可能不一致。

答案 : 使用分布式事务实现消息一致性

优点:解耦,异步,削峰

4.如何保证消息队列的高可用

保证消息队列的高可用, 集群

RabbitMQ集群分为普通集群和镜像集群

普通集群:

创建的Queue只会放在一个RabbitMQ上,其他实例都同步元数据,如果实际数据宕机,元数据无法访问实际数据,其他实例也就无法同步,他并不能做到高可用,只不过是对Quene中信息,进行备份,缓解访问压力

镜像集群:

每次生产者写消息到queue的时候,都会自动把消息同步到多个实例的queue上,每个RabbitMq节点上都有Queue的消息数据和元数据,某一个节点宕机,其他节点依然保存完整数据,不影响客户端消费,类似于redis中的哨兵模式

上面说的是rabbitMQ集群 ,那RocketMQ如何保证高可用呢?

双主双从

5.如何保证消息不丢失

消息丢失原因?

情况一:消息生产者没有成功发送到MQ(发送过程成丢失)

情况二:消息发送给了MQ后,MQ宕机导致内存中的消息数据丢失

情况三:消费者消费到了消息,但是没有处理完毕就出现异常导致丢失

如何保证消息不丢失?

1.消息发送者发送给MQ后,MQ给生产者确认收到

2.MQ收到消息后进行消息持久化

3.消费者收到消息处理完毕后手动ack确定,不要自动ack确认

4.MQ收到消费者ack确认后删除持久化的消息

6.如何保证消息不被重复消费?(如何保证消息消费的幂等性?)

产生重复消息的原因:

根本原因: 网络不可达

发送时消息重复:当生产者发送消息给MQ 中途出现网络的抖动等其他原因,导致服务端对客户端应答失败。如果此时生产者意识到消息发送失败,再次发送,消费者会收到两条内容相同的消息

消费是消息重复: 消息已经投递到了消费者并完成业务处理,当消费方给MQ服务端反馈应答的时候网络闪断。为了保证消息至少被消费一次,MQ服务端将在网络恢复后再次尝试投递之前已被消费方处理过的消息,此时消费者就会收到两条内容相同的消息

我们不能保证网络100%通畅,所有必定会存在重复消息

解决办法:

1.消息发送者发送消息时携带一个全局唯一id

2.消费者获取消费后先根据id在redis/db中查询是否存在消费记录

3.如果没有消费过就正常消费,消费完毕后写入redis/db

4.如果消息消费过就直接舍弃

7.如何保证消息消费的顺序性?

消息有序指的是可以按照消息的发送顺序来消费

分为全局顺序消息和局部顺序消息,常见的是局部顺序消息

RabbitMQ

全局顺序消息

生产者:MQ:消费者=1:1:1

这种消费能保证消息顺序到达MQ,也可以保证消息顺序消费

但是,他的吞吐量会下降,容错性降低,全局的顺序消费,不常见

RocketMQ

局部顺序消费:

1.生产者根据消息ID将同一组消息发送到一个Queue中。

2.多个消费者同时获取Queue中的消息进行消费。

3.MQ使用分段锁保证单个Queue中的有序消费

8.大量消息堆积处理怎么处理?

消费方出现了故障导致消息没有正常消费:

1.网络故障

2.消费方处理消息后没有给MQ Server正常应答

消息堆积的处理方案

1.检查并修复消费方的正常消费速度

2.将堆积消息转存到容量更大的MQ集群

3.增加多个消费者节点并行消费堆积消息

4.消费完毕后,恢复原始架构

9.消息过期怎么处理?

消息过期的原因:

消息设置了过期时间,如果超时还未被消费,则视为消息过期,过期消息可以转存到死信队列(如果没有配置死信队列,则该消息被删了)

消息过期的处理方案:

1.设置死信队列,接收过期消息

2.启动专门的消费者消费死信队列消息

3.查询数据库消息日志,重新发送消息到MQ


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

相关文章

消息队列 面试题

1、面试题 为什么使用消息队列啊?消息队列有什么优点和缺点啊?kafka、activemq、rabbitmq、rocketmq都有什么区别以及适合哪些场景? 2、面试官心理分析 其实面试官主要是想看看: (1)第一,你…

消息队列面试题及答案

1、为什么使用消息队列? 消息队列使用的场景和中间件有很多,但解决的核心问题主要是:异步、解耦、消峰填谷。 2、消息队列的优缺点 异步、解耦、消峰填谷这是消息队列最大的优点,除了这些消息队列还可以会解决一些我们特殊业务…

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

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

消息队列面试题(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;…