消息队列常见面试题总结

文章目录

    • 1 消息队列有什么用 ?
    • 2 使用消息队列会带来哪些问题
    • 3 如何保证 RabbitMQ 消息的顺序性?🔥
    • 4 RabbitMQ-如何保证消息不丢失🔥
    • 5 RabbitMQ 消息的重复消费问题如何解决的🔥
    • 6 RabbitMQ 延迟队列⭐
    • 7 RabbitMQ 消息怎么传输?
    • 8 RabbitMQ 消息怎么路由?
    • 9 如果有100万消息堆积在 MQ , 如何解决 ?🔥
    • 10 如何保证 RabbitMQ 高可用的?
    • 11 那出现丢数据怎么解决呢?
    • 12 Kafka 高性能和高吞吐量的原因:
    • 13 常见消息队列的区别🔥

本文作者:夏日。

1 消息队列有什么用 ?

  1. 异步处理:将用户请求中的耗时操作,通过消息队列实现异步处理。将对应的消息发送到消息队列之后就立即返回结果,减少响应时间,提升用户体验。
  2. 削峰/限流:先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。
  3. 降低系统耦合性:生产者发送消息到消息队列中去,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合。
  4. 延迟任务:大部分消息队列都支持延时消息,例如30分钟后取消未支付订单。

2 使用消息队列会带来哪些问题

  • 系统可用性降低: 系统可用性在某种程度上降低,在加入 MQ 之前,你不用考虑消息丢失或者说 MQ 挂掉等等的情况,但是,引入 MQ 之后就需要去考虑了!
  • 系统复杂性提高: 加入 MQ 之后,需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题。
  • 一致性问题: 消息队列带来的异步可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息就会导致数据不一致的情况。

3 如何保证 RabbitMQ 消息的顺序性?🔥

  • 拆分多个消息队列,每个消息队列对应一个消费者。这样消息队列会多一些,可以在消费者内部采用多线程的方式进行消费;
  • 或者就一个消息队列对应一个消费者,然后这个消费者内部用内存队列做排队,然后分发给底层不同的 worker (某个线程)来处理。这里消费者并不直接消费消息,而是将消息根据关键值(比如:订单 id)进行哈希,哈希值相同的消息保存到了相同的内存队列里。每个内存队列有且只有一个对应的 worker。也就是说,需要保证顺序的消息会按照进入的顺序被这个唯一的 worker 处理。

4 RabbitMQ-如何保证消息不丢失🔥

消息丢失的三种情况:生产者发消息到 MQ 的过程中丢失,MQ 中丢失,MQ 到消费者的过程中丢失。

  • 生产者到 RabbitMQ:
    • 可以用 RabbitMQ 提供的事务机制,就是生产者发送数据之前开启 RabbitMQ 事务,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务,然后重试发送消息。
    • 或者使用 confirm 机制,如果消息写入了 RabbitMQ 中,RabbitMQ 会回传一个 ack 。如果 RabbitMQ 没能处理这个消息,会告诉生产者消息接收失败。或者超过一定时间后还没收到 ack 就重新发送。
    • 注意:事务机制(同步,会阻塞)和 Confirm 机制(异步,推荐)是互斥的,两者不能共存。
  • RabbitMQ 自身:开启 RabbitMQ 的持久化,就是消息写入之后会持久化到磁盘,哪怕是 RabbitMQ 自己挂了,恢复之后会自动读取之前存储的数据。
  • RabbitMQ 到消费者:RabbitMQ 提供了消息确认机制。在声明队列时,可以指定 noAck 参数,当 noAck=false 时,RabbitMQ 会等待消费者显式发回 ack 后,才会移除消息。

5 RabbitMQ 消息的重复消费问题如何解决的🔥

  • 生产者发送每条消息的时候,里面加一个全局唯一的 id,比如课程 id 。消费者拿到消息后,先根据这个 id 查一下之前消费过吗。如果没有消费过,再处理消息。
  • 基于数据库的唯一约束来保证不会重复插入多条数据,重复数据插入会报错,不会导致数据库中出现脏数据。

6 RabbitMQ 延迟队列⭐

延迟队列就是用到了死信交换机和 TTL(消息存活时间)实现的。

在我们发消息的时候可以按照需求指定 TTL 的时间,如果消息超时未消费就会变成死信,在 RabbitMQ 中如果消息成为死信,会被发送到死信交换机,死信交换机将过期的消息路由到死信队列,消费者监听死信队列中的消息,一旦收到消息,执行相应的业务逻辑,比如取消订单操作。这样就实现了延迟队列的功能了。

RabbitMQ 还提供了一个延迟队列插件,设置交换机的类型为 x-delayed-message。延迟队列插件根据消息的延时时间,将消息放入延迟队列中,并设定消息的过期时间。一旦消息过期,延迟队列插件会将消息发送到指定的目标队列中。消费者监听目标队列中的消息,一旦收到消息,执行相应的业务逻辑,比如取消订单操作。

7 RabbitMQ 消息怎么传输?

由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的信道数量没有限制。

8 RabbitMQ 消息怎么路由?

生产者把消息发送到 RabbitMQ 的交换机上。交换机把收到的消息根据路由规则发给绑定的队列。最后再把消息投递给订阅了这个队列的消费者,从而完成消息的异步通讯。

常用的交换机主要分为以下三种:

  • fanout:会把发送到该交换机的消息路由到所有与它绑定的队列中
  • direct:会把消息路由到那些 Bindingkey 与 RoutingKey 完全匹配的队列中
  • topic:与 direct 类似,但匹配规则可以使用通配符。

9 如果有100万消息堆积在 MQ , 如何解决 ?🔥

  • 提高消费者的消费能力,可以使用多线程消费任务
  • 增加更多消费者,提高消费速度
  • 扩大队列容积,提高堆积上限,可以使用 RabbitMQ惰性队列,惰性队列的好处主要是
    • 接收到消息后直接存入磁盘而非内存
    • 消费者要消费消息时才会从磁盘中读取并加载到内存
    • 支持数百万条的消息存储

10 如何保证 RabbitMQ 高可用的?

RabbitMQ 有三种模式:单机模式、普通集群模式(提高吞吐量但无高可用)、镜像集群模式

可以使用镜像集群模式。镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节点,如果主节点宕机后,镜像节点会替代成新的主节点,不过在主从同步完成前,主节点如果宕机,可能出现数据丢失

11 那出现丢数据怎么解决呢?

我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于 Raft 协议,强一致。

并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是仲裁队列即可

12 Kafka 高性能和高吞吐量的原因:

  1. 顺序写磁盘: Kafka 采用顺序写磁盘的方式来存储消息,而不是随机写磁盘。现代操作系统对顺序写的磁盘操作进行了大量优化,使得顺序写的速度接近内存写的速度。

  2. 零拷贝技术: Kafka 使用了 Linux 的零拷贝(zero-copy)技术,减少了数据在内存和磁盘之间的拷贝次数。这大大降低了 CPU 的使用率,并提高了数据传输的效率。

  3. 分布式架构: Kafka 是分布式消息系统,支持将数据分片(partition)存储在不同的 broker 上,每个分片可以独立写入和读取,极大地提高了系统的并发处理能力。

  4. 消息的批量处理: Kafka 在数据传输时支持批量发送和拉取消息,减少了网络请求的频率,从而提高了整体吞吐量。批量处理使得单次网络开销能够分摊到多条消息上。

  5. 内存映射文件: Kafka 使用了操作系统的内存映射文件技术(mmap),将磁盘文件直接映射到内存中,这样在读取消息时,不需要频繁从磁盘读取数据,提升了性能。

  6. 高效的数据压缩: Kafka 支持多种压缩算法(如 Snappy、GZIP 等),用户可以选择启用消息压缩,从而减少消息传输中的带宽消耗,进一步提高系统吞吐量。

  7. 分区并行: Kafka 的分区机制允许消费者可以并行消费不同分区的数据,这极大提高了消费的并发性和吞吐量,特别是在高负载场景下。

  8. 异步复制机制: Kafka 允许在数据写入后异步将数据复制到其他副本,从而在保证数据可靠性的同时,不影响写入性能。

13 常见消息队列的区别🔥

  1. RabbitMQ 基于 Erlang 开发,吞吐量方面虽然稍逊于 RocketMQ 和 Kafka,但是延迟很低,能达到微秒级。如果是中小型公司,基础架构研发能力较弱,采用 RabbitMQ 是不错的选择,简单易用。
  2. RocketMQ 阿里开源的项目,基于 Java 开发,适用于需要极高可靠性的场景。对于基础架构研发实力较强的大公司,可以采用 RocketMQ,因为开源所以可以定制自己公司的 MQ。
  3. 如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,仅仅提供较少的核心功能,但是具备极高的吞吐量分布式扩展能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WSL进阶体验:gnome-terminal启动指南与中文显示问题一网打尽

起因 我们都知道 wsl 启动后就死一个纯命令行终端,一直以来我都是使用纯命令行工具管理Linux的。今天看到网上有人在 wsl 中启动带图形界面的软件。没错,就是在wsl中启动带有图形界面的Linux软件。比如下面这个编辑器。 ​​ 出于好奇,我就…

Linux部署python web项目Flask + gunicorn + nginx

文章目录 一、安装python&使用虚拟环境二、python程序重要参数加密2.1 非对称加密(RSA)2.2 生成密钥对2.4 以连接数据库参数加密为例2.4.1 工具类RSA.py 三、一个简单的Flask项目四、安装配置gunicorn4.1 安装4.2 启动/配置(选择eventlet)4.2.1 命令…

vue打包exe之electron-quick-start的npm install 报错

vue打包exe之electron-quick-start的npm install 报错 1、github地址2、问题3、解决4、其他(打包exe)参考 1、github地址 https://github.com/electron/electron-quick-start2、问题 我使用的pnpm install正常安装,执行npm start提示错误 3、解决 在package.js…

【LLM多模态】文生视频综述From Sora What We Can See: A Survey of Text-to-Video Generation

note 现在很多主流的文生视频应该还是Diffusion-based 基于扩散模型的方法这篇综述将现有研究按照三个维度进行分类:进化生成器(Evolutionary Generators)、卓越追求(Excellent Pursuit)、现实全景(Realis…

【学习笔记】MIPI

MIPI介绍 MIPI是由ARM、Nokia、ST、IT等公司成立的一个联盟,旨在把手机内部的接口如存储接口,显示接口,射频/基带接口等标准化,减少兼容性问题并简化设计。 MIPI联盟通过不同的工作组,分别定义一系列手机内部的接口标…

植物大战僵尸杂交版V2.5.1下载(最新版)

2.5.1版本更新公告: 在最新的2.5.1版本中,游戏对“两面夹击”关卡进行了多项重要调整。出怪倍率和种类均有所降低,部分关卡的初始阳光量也得到了调整,以增强玩家的策略性。同时,玩家可以在这些关卡中使用投手类植物&a…

sysbench 命令:跨平台的基准测试工具

一、命令简介 sysbench 是一个跨平台的基准测试工具,用于评估系统性能,包括 CPU、内存、文件 I/O、数据库等性能。 ‍ 比较同类测试工具 bench.sh 在上文 bench.sh:Linux 服务器基准测试中介绍了 bench.sh 一键测试脚本,它对…

RabbitMQ下载安装运行环境搭建

RabbitMQ运行环境搭建 1、Erlang及RabbitMQ安装版本的选择2、下载安装Erlang2.1、下载Erlang2.2、安装Erlang2.2.1、安装Erlang前先安装Linux依赖库2.2.2、解压Erlang压缩包文件2.2.3、配置2.2.4、编译2.2.5、安装2.2.6、验证erlang是否安装成功 3、RabbitMQ下载安装3.1、下载3…

FortiGate 无线组网

无线管理与配置 FortiAP 连接 internal 接口之后自动获得 ip 地址:192.168.1.xxx/24在 FortiGate 中创建 SSIDFortiGate 自动发现 FortiAP,将 FortiAP 添加到 FortiGate将 SSID 和 FortiAP 关联创建防火墙策略 下面我们就来一起看看在 FortiGate 中该如…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC,于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核(big.LITTLE)。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320,频率…

前端——js基础

一、JavaScript (简称js)——js可以给网页实现一个动态效果 1.JavaScript 组成 - 核心语法 ECMScipt 简称(es): 规范js的基本语法 1.es是js的语法规范 管理者 2.js是es的实现 操作者 - DOM > 文档对象 提供js操作 (例如…

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目: 题解: func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

jq实现:点击图片时弹出详情弹窗,判断拖动图片时不弹出

1.需求分析: 要实现点击图片时弹出详情弹窗,但在拖动时不弹出,可以使用 jQuery 来判断用户的操作。可以通过设置一个标志变量来判断用户是否在拖动图片。 并且在鼠标拖动某个图片时将其层级设置为最上面,可以使用 jQuery 结合 CSS 的 z-index 属性 说明 : 标志变量:使用…

传输层TCP协议

一、TCP协议格式 我们看到报头固定有20字节,最后选项大小不固定。 4位首部长度(二进制0000 ~ 1111,十进制范围[0, 15])单位是4字节(存放字节大小范围[0, 60])包括了20字节固定长度 选项长度。若选项大小为…

PWA(Progressive web APPs,渐进式 Web 应用): manifest.json、 Service Worker

文章目录 引言I 什么是 PWA功能特性技术上分为三个部分:II Web 应用清单将Web 应用清单文件链接到站点manifest.json字段说明III Service WorkerService worker 本质Service worker 运行在 worker 上下文注册服务辅助角色扩展知识将 PWA 作为脱机应用定义当前文档与被链接文档…

用Python实现运筹学——Day 4: 线性规划的几何表示

一、学习内容 线性规划的几何表示: 线性规划问题的解通常位于一个凸多边形(即可行解空间)的顶点上,这意味着在求解线性规划问题时,只需要找到可行解空间中的顶点并计算出目标函数值,再选择其中的最优解。 可…

C++之分割字符串的两种方式

方式一 #include <string> #include <vector> #include <sstream> #include <iostream>std::vector<std::string> split(const std::string& str, char delim) {std::stringstream ss(str);std::string item;std::vector<std::string>…

C语言贪吃蛇小游戏演示和说明

C语言贪吃蛇小游戏演示和说明 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础&#xff0c;训练编程思维&#xff0c;培养解决问题的思路&#xff0c;领略多姿多彩的C语言。 游戏开始后&#xff0c;会在中间位置出现一条只有三个节点的贪吃蛇&#xff0c;并随机出现一个食物&am…

keepalived+lvs集群,实现高可用

环境准备&#xff1a;两台虚拟机&#xff0c;关闭防火墙&#xff0c;selinux,配置阿里云仓库&#xff0c;配置epel 192.168.88.21 dr1 负载均衡器 master 192.168.88.22 dr2 负载均衡器 backup 192.168.88.23 rs1 web1 192.168.88.24 rs2 web2 实验说明&…

项目启动错误

说明&#xff1a;记录一次项目启动&#xff0c;报数据库访问错误&#xff0c;如下&#xff1a; 错误信息&#xff1a;Invalid default&#xff1a;public abstract java.lang.Class tk.mybatis.spring.annotation.MapperScan.fatoryBean() 解决 没有引入mybatis依赖&#xff…