MQ消息队列面试题

article/2025/9/18 15:13:15

MQ消息队列面试题

什么是消息队列

消息队列,就是指保存消息的一个容器。类似于数据库、缓存等,用来保存数据的。
消息队列,就是一个使用队列来通信的组件

为什么需要消息队列,消息队列的应用场景

提供系统性能首先考虑的是数据库的优化,但是数据库因为历史原因,横向扩展是一个非常复杂的工程,所以我们一般会尽量把流量都挡在数据库之前。
消息队列就可以将流量挡在前面,有如下的应用场景

  • 异步处理:异步发送邮件、短信等
  • 应用解耦:订单系统和库存系统解耦
  • 流量削峰:秒杀
  • 消息通讯:聊天室,在一个主题下 实现点对点、群聊
  • 海量数据同步(日志):kafka,binglog同步
  • 任务调度:延迟队列、死信队列 的应用。订单超时30分钟取消订单
  • 分布式事务:RabbitMQ(comfirm,手动ack)、RocketMQ(支持事务)

消息队列的优缺点

  • 优点:解耦、异步、削峰等场景
  • 缺点:保证MQ可用性、系统复复杂度提升、一致性问题

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

集群部署

  • RabbitMQ集群部署有两种模式:镜像队列模式、普通模式(通过共享元数据实现集群,所以普通模式不能实现高可用,某个节点挂了,这个节点上的消息将无法被消费)
  • Kafka:通过zookeeper管理Broker与consumer的动态加入与离开
  • RocketMQ:通过NameServer管理Broker。NameServer和Zookeeper的作用差不多

如何保证消息的可靠性,如何保证消息不丢失

  • RabbitMQ:
    第一种:事务(不推荐)
    第二种:
    生产端 开启Comfirm
    Broker 持久化 交换机、队列、消息
    消费端 手动ACK
  • Kafka:Kafka消息一直存储在磁盘中,定时清理,可以重复消费。由Consumer自己保存状态,也不要任何确认,consumer可以再次获取消息
  • RocketMQ:
    事务消息,手动ACK都可以

如果处理重复消息(幂等性)

幂等处理:每一个消息用一个唯一的表示区分,消费前先判断标识有没有被消费,若已消费,直接ACK

如何保证消息的有序性

  • RabbitMQ:将消息放入同一个交换机,交给一个队列,这个队列只有一个消费者,消费者只允许同时开启一个线程
  • Kafka:partition是一个有序队列,所以 消息发送给一个partition,group中就有一个消费者,实现有序
  • RocketMQ:支持顺序消费,将消费发送给一个queue,一个单线程的消费者

如果处理消息堆积

  • 消息堆积 往往是因为 生产者生产速度和消费者消费速度不匹配造成的。
  • 首先需要先定位消费慢的原因,如果是bug先处理bug。如果是消费者本身能力弱,我们需要优化消费者能力,比如之前一条一条消费,改成批量消费
  • 如果优化完毕,还是慢,那就需要水平扩容了,增加Topic数据和消费者数量。如果是bug影响的那么就可以增加临时队列提高消费速度,恢复之后,在将临时队列和consumer停掉

说一下你了解的MQ,说出几种MQ之间的区别

RabbitMQ、Kafka、RocketMQ

  • RabbitMQ传统消息队列,性能优化ActiveMQ,也支持高可用
  • Kafka 流式处理,性能强,一般用户日志等处理
  • RocketMQ,集成了RabbitMQ和Kafka的优点,性能强,但是社区不活跃、文档不充分
    请添加图片描述

低延时高吞吐,做了什么优化

消息顺序读写、PageCache读写缓存、异步刷盘、零拷贝、分区机制 提升并发、压缩消息、批量处理

RabbitMQ整个流程,RabbitMQ 有哪些重要的角色,RabbitMQ 有哪些重要的组件

看RabbitMQ开头的笔记
请添加图片描述

RabbitMQ 有几种广播类型

目前有四种类型:direct、fanout、topic、headers。headers匹配AMQP消息的Header而不是路由键,此外headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到。

  • direct:直连
  • fanout:广播
  • topic:订阅,模糊匹配

RabbitMQ 包含事务功能吗?如何使用?

支持事务

  • 主要对信道(Channel)的设置,主要有以下三种方法:
  • channel.txSelect() 声明启动事务模式
  • channel.txComment() 提交事务
  • channel.txRollback() 回滚事务

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

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

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

  • 之前版本不能脱离使用。因为Kafka使用Zookeeper管理和协调Kafka的节点服务器
  • 新版本支持独立使用,还在测试阶段

Kafka 有几种数据保留的策略

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

Kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 Kafka 将如何处理?

Kafka会执行数据清理工作,时间和大小不论达到哪个条件,都会清理数据

Kafka 的分区策略有哪些?

4种分区策略

  • 给定分区号,直接将数据发送指定的分区里面去
  • 没给分区号,给定数据的key值,通过key取上hashCode进行分区
  • 没给分区号,没给key值,直接轮训进行分区
  • 自定义分区

什么情况会导致 Kafka 运行变慢?

  • CPU性能瓶颈
  • 磁盘读写瓶颈
  • 网络瓶颈

使用 Kafka 集群需要注意什么?

  • 集群的数量不是越多越好,最好不超过7个,因为节点越多,消息复制需要的时候就越长,整个集群的吞吐量就越低
  • 集群数量最好是单数,因为超过一般故障集群就不能用了,设置单数容错率更高

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

相关文章

常见消息队列面试题

常见消息队列面试题 1.为什么要用消息队列?(消息队列的应用场景?) 消息队列的本质? 消息队列是一种“先进先出”的数据结构,一般用其作为数据的传递 常见的应用场景:解耦,异步以及削峰 解耦: 场景:双11是…

消息队列 面试题

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;它经历了历史的变革。 项目菜鸟(刚入维护)——》中级老鸟(重构完结…