当前位置: 首页 > news >正文

Java面试题———RabbitMQ篇

目录

1.你们项目中哪里用到了RabbitMQ

2、为什么会选择使用RabbitMQ

3、使用RabbitMQ如何保证消息不丢失

4、消息的重复消费问题如何解决的

5、如何解决消息堆积在MQ的问题

6、RabbitMQ如何保证消费的顺序性

7、RabbitMQ的延迟队列有了解过嘛

8、RabbitMQ如何设置消息过期

9、什么是死信交换机

10、RabbitMQ的集群有哪些


1.你们项目中哪里用到了RabbitMQ

RabbitMQ是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 :

  1. 通过Feign实现服务的同步调用

  2. 通过MQ实现服务的异步通信

下面要结合自己的项目中功能来说两个地方

  1. xxx

  2. xxx

2、为什么会选择使用RabbitMQ

我们项目中之所以选择使用RabbitMQ,是因为它的功能比较丰富 , 支持各种消息收发模式, 支持延迟队列 , 惰性队列

而且天然支持集群, 保证服务的高可用, 同时性能非常不错 , 社区也比较活跃, 文档资料非常丰富

使用MQ有很多好处,简单跟您说几个:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速

  • 故障隔离:服务没有直接调用,不存在级联失败问题

  • 调用间没有阻塞,不会造成无效的资源占用

  • 耦合度极低,每个服务都可以灵活插拔,可替换

  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

当然使用使用MQ也有一些缺点

  • 架构复杂了,业务没有明显的流程线,不好管理

  • 需要依赖于Broker的可靠、安全、性能

总之,瑕不掩瑜,使用了RabbitMQ之后可以大大提供程序的效率

3、使用RabbitMQ如何保证消息不丢失

消息从生产者发送到消费者接收,会经历多个过程 , 其中的每一步都可能导致消息丢失

大体可以分为这样几种情况:

  1. 消息发送到交换机丢失

  2. 消息从交换机路由到队列丢失

  3. 消息保存到队列中丢失

  4. 消费者消费消息丢失

针对每一步,RabbitMQ分别给出了解决方案:

  1. 消息发送到交换机丢失:发布者确认机制

    消息发送到交换机失败会向生产者返回失败原因,生产者通过回调接收发送结果,如果发送失败,重新发送,或者记录日志人工介入

  2. 消息从交换机路由到队列丢失:发布者回执机制

    消息从交换机路由到队列失败会向生产者返回失败原因 ,生产者通过回调接收回调结果,如果发送失败,重新发送,或者记录日志人工介入

  3. 消息保存到队列中丢失:MQ持久化

    RabbitMQ运行开启交换机持久化、队列持久化、消息持久化,以保证消息在传输过程中不会丢失

  4. 消费者消费消息丢失:消费者确认机制

    消费者确认机制指的是只有消费者一方确认消息消费成功了,mq才删除消息,否则就会重新发送消息给消费者

通过RabbitMQ本身所提供的机制基本上已经可以保证消息不丢失, 但是因为一些特殊的原因还是会发送消息丢失问题 ,

例如 : 回调丢失 , 系统宕机, 磁盘损坏等 , 这种概率很小 , 但是如果想规避这些问题 , 进一步提高消息发送的成功率, 也可以通过程序自己进行控制

设计一个消息状态表 , 主要包含 : 消息id , 消息内容 , 交换机 , 消息路由key , 发送时间, 签收状态等字段 , 发送方业务执行完毕之后 , 向消息状态表保存一条消息记录, 消息状态为未签收 , 之后再向MQ发送消息 , 消费方接收消息消费完毕之后 , 向发送方发送一条签收消息 , 发送方接收到签收消息之后 , 修改消息状态表中的消息状态为已签收 ! 之后通过定时任务扫描消息状态表中这些未签收的消息 , 重新发送消息, 直到成功为止 , 对于已经完成消费的消息定时清理即可 !

4、消息的重复消费问题如何解决的

在使用RabbitMQ进行消息收发的时候,如果发送失败或者消费失败会自动进行重试,那么就有可能会导致消息的重复消费

解决方案:

  • 每条消息设置一个唯一的标识id

  • 幂等方案

    • token+redis

    • 分布式锁

    • 数据库锁(悲观锁、乐观锁)

5、如何解决消息堆积在MQ的问题

解决消息堆积有几种种思路:

  1. 提高消费者的消费能力,例如使用多线程消费

  2. 增加消费者数量,提高消费速度,可以使用ork队列模式,设置多个消费者消费消费同一个队列中的消息

  3. 扩大队列容积,提高堆积上限

  4. 使用RabbitMQ惰性队列,接收到消息后直接存入磁盘而非内存,消费者要消费消息时才会从磁盘中读取并加载到内存

6、RabbitMQ如何保证消费的顺序性

一个队列只设置一个消费者消费即可 , 多个消费者之间是无法保证消息消费顺序性的

7、RabbitMQ的延迟队列有了解过嘛

RabbitMQ的延迟队列有两种实现方案 :

  1. 使用消息过期TTL + 死信交换机

  2. 使用延迟交换机插件

8、RabbitMQ如何设置消息过期

RabbitMQ设置消息过期的方式有两种 :

  1. 在队列上设置过期时间,所有进到这个队列的消息就会具有统一的过期时间

  2. 为消息单独设置过期时间

注意 :

  1. 队列过期和消息过期同时存在 , 会以时间短的时间为准

  2. RabbitMQ队列消息过期的机制是判断队列头部元素是否过期 , 如果队里头部消息没有到过期时间 , 中间消息到了过期时间, 这个消息也不会被自动剔除

9、什么是死信交换机

死信交换机和正常的交换机没有什么不同,当一个包含死信的队列使用dead-letter-exchange属性,指定了一个交换机,这个交换机称为死信交换机

也就是说只有队列中的死信才会流转到死信交换机,而当一个队列中的消息满足下列情况之一时,就会成为死信:

  • 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false

  • 消息是一个过期消息,超时无人消费

  • 要投递的队列消息满了,无法投递

一般的死信交换机还会再跟着一个专门的队列,用来专门存储所有的死信,以方便后期的人工干预

10、RabbitMQ的集群有哪些

RabbitMQ天然支持集群模式,它的集群有两种模式:

  • 普通集群:是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力

    这种集群会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息。

    当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回

    如果队列所在节点宕机,队列中的消息就会丢失

  • 镜像集群:是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。

    这种集群模式下,交换机、队列、队列中的消息会在各个mq的镜像节点之间同步备份

    创建队列的节点被称为该队列的主节点,备份到的其它节点叫做该队列的镜像节点。

    一个队列的主节点可能是另一个队列的镜像节点

    所有操作都是主节点完成,然后同步给镜像节点

    主宕机后,镜像节点会替代成新的主机

相关文章:

Java面试题———RabbitMQ篇

目录 1.你们项目中哪里用到了RabbitMQ 2、为什么会选择使用RabbitMQ 3、使用RabbitMQ如何保证消息不丢失 4、消息的重复消费问题如何解决的 5、如何解决消息堆积在MQ的问题 6、RabbitMQ如何保证消费的顺序性 7、RabbitMQ的延迟队列有了解过嘛 8、RabbitMQ如何设置消息过…...

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书,有时在项目中需要使用免费的 SSL 证书,Aliyun 提供免费证书,三个月有效期,可以直接在aliyun 申请,搜索 SSL 证书,选择测试证书。 Aliyun 证书需要每三月来来换一次,页…...

49.给出一个字符串数组,实现一个算法给定一组字符串,将字母异位词组合在一起

49. Group Anagrams 题目 给定一组字符串,将字母异位词组合在一起。 示例: 输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] 注意: 所有输入均为小写字母。输出的顺序可以…...

如何制作统信UOS启动盘?

如何制作统信UOS启动盘? 一、下载UOS系统安装镜像二、在UOS系统环境下制作启动盘步骤一:准备U盘步骤二:打开启动盘制作工具步骤三:选择ISO镜像文件步骤四:选择安装介质并格式化步骤五:等待制作完成 三、在W…...

Conda命令

查看当前有哪些虚拟环境 conda env list创建(删除)一个新的虚拟环境 conda create --name test1 python3.8 conda env remove --name test1进入和退出一个环境 conda activate test1 conda deactivate列出当前包安装的包 conda list安装包 conda in…...

perl——获取数组中元素的索引

参考: 如何获取数组中元素的索引 如果保证所有元素都是唯一的,或者只有第一个索引是感兴趣的: my ($index) grep { $array[$_] ~~ $element } 0 .. $#array;...

Vector vs 数组:Java中Vector相比数组的优点

每日自动更新各类学习教程及工具下载合集 ​​https://pan.quark.cn/s/874c74e8040e​​ 在Java编程中,数组(Array)和Vector都是用于存储数据的容器,但它们在设计和功能上有所不同。选择使用哪种数据结构取决于具体的需求。在这…...

掌握步进电机控制算法:提升自动化精度的关键(代码示例)

引言 步进电机因其高精度定位、良好的控制性能和简单的驱动方式,广泛应用于各类自动化设备中,如3D打印机、数控机床和机器人等。为了实现对步进电机的精确控制,采用合适的控制算法至关重要。本文将详细介绍几种常见的步进电机控制算法&#…...

MySQL的源码安装及基本部署(基于RHEL7.9)

这里源码安装mysql的5.7.44版本 一、源码安装 1.下载并解压mysql , 进入目录: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz tar xf mysql-boost-5.7.44.tar.gz cd mysql-5.7.44/ 2.准备好mysql编译安装依赖: yum install cmake g…...

RUP-系统架构师(五十六)

1在RUP中采用“41”视图模型来描述软件系统的体系结构。在该模型中,最终用户侧重于(),系统工程师侧重于()。 问题1 问题2 A 实现视图 B 进程视图 C 逻辑视图 D 部署视图 解析: RUP有 逻辑…...

【大模型系列篇】人工智能与智能计算的发展

🔥🔥🔥 来自 中国工程院院士、中国科学院计算技术研究所研究员 孙凝晖 第十四届全国人大常委会专题讲座上的讲稿《人工智能与智能计算的发展》 “把新一代人工智能作为推动科技跨越发展、 产业优化升级、生产力整体跃升的驱动力量&#xff0c…...

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };...

c++-类(中)

c-类&#xff08;中&#xff09; 一、类的默认成员函数1.1 什么是默认成员函数&#xff1f;1.2 默认成员函数有哪些&#xff1f; 二、构造函数2.1 什么是构造函数&#xff1f;2.2 构造函数的特点 三、析构函数3.1 什么是析构函数&#xff1f;3.2 析构函数的特点 四、拷贝构造函…...

在 Python 中查找列表中的重复元素

在 Python 中查找列表中的重复元素 在数据处理和分析中,查找重复元素是一个常见的任务。无论是在数据清洗、用户输入验证还是统计分析中,识别和处理重复数据都是至关重要的。在 Python 中,有多种方法可以查找列表中的重复元素。本文将详细介绍这些方法,包括示例代码、性能…...

Kafka【一】Windows下安装单节点Kafka

① 下载 下载软件安装包&#xff1a;kafka_2.12-3.6.1.tgz&#xff0c;下载地址&#xff1a;https://kafka.apache.org/downloads 这里的3.6.1&#xff0c;是Kafka软件的版本。截至到2023年12月24日&#xff0c;Kafka最新版本为3.6.1。2.12是对应的Scala开发语言版本。Scala2…...

基于深度学习的分子生成

基于深度学习的分子生成是一项结合化学、计算科学与人工智能的新兴领域&#xff0c;旨在利用深度学习模型来生成具有特定性质的分子结构。该技术在药物发现、材料科学和合成化学等领域具有广泛的应用前景。以下是详细的介绍&#xff1a; 1. 背景与动机 化学空间的广阔性&#…...

python——并行设计

在 Python 中&#xff0c;通过并行设计可以提高程序的效率&#xff0c;特别是在需要处理大量数据或进行耗时操作时。并行设计的基本思想是通过分配任务给多个线程或进程&#xff0c;利用多核 CPU 的计算能力&#xff0c;来同时执行多个任务&#xff0c;从而缩短总的执行时间。 …...

系统架构设计师——软件架构基本概念

基本概念 **软件架构是软件开发中的一个核心概念&#xff0c;它主要关注软件构件的结构、属性和交互作用。**以下是对软件架构的详细解读&#xff1a; 结构&#xff1a;软件架构定义了软件系统的基本结构&#xff0c;包括各个组件、模块和类的关系。这些元素如何组织和相互连…...

证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别

目录 一、背景二、文件格式的区分2.1 .keystore / .jks 文件2.2 .p12 / .pfx 文件2.3 .crt 文件2.4 csr 文件2.5 .pem 文件 三、总结 一、背景 我们在日常的开发过程中&#xff0c;经常会见到各种各样的证书相关类型的文件&#xff0c;错综复杂。 其实 keystore、jks、p12、p…...

基于python的在线自主评测系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...