RabbitMQ-第五章:RabbitMQ的面试题
目录1.什么是RabbitMQ2.RabbitMQ可以做什么3.在RabbitMQ中怎么保证消息的顺序问题。就比如我有ABC三个消息。我必须要按照ABC进行消费4.RabbitMQ怎么保证不会重复消费5.RabbitMQ 怎么保证消息不会被丢失6.在RabbitMQ 中我们要不要对全部的消息进行持久化为什么1.什么是RabbitMQRabbitMQ是一个开源的消息队列系统RabbitMQ使用AMQP高级消息队列协议标准。而RabbitMQ主要的目的是提供可靠的消息传递。确保消息的可靠性和顺序性。也提供了比较灵活的路由交换机策略和保证消息消费确认机制。RabbitMQ是基于AMQP协议工作也支持些其他协议。它通过消息的发布与订阅模式来实现消息的传递与消费。RabbitMQ主要包含的角色生产者交换机队列和消费者。生产者负责生成消息而交换机负责接收生产者的消息并根据具体的规则路由传递到队列。而队列负责存储这些消息。让消费者进行消费。交换机主要分广播交换机头部交换机强制匹配主题交换机和模糊匹配主题交换机四种交换机类型但是现在头部交换机因为效率原因导致基本上都不使用了。2.RabbitMQ可以做什么RabbitMQ 的本质是 “消息中转站”解决分布式系统中 “通信” 的核心问题核心能力有 3 个解耦系统间不直接调用通过消息传递数据比如订单系统不用直接调用库存系统只需发送 “扣减库存” 消息库存系统监听消息处理后续改库存逻辑不影响订单系统在APS系统中锁单库存需要通知订购易系统没有直接去调用订购易系统就是通过mq去通知。也不影响其他业务。异步无需等待接口返回比如用户下单后不用等 “发短信、减库存、生成物流单” 都完成才返回只需发送消息用户立即收到 “下单成功”后续逻辑异步处理削峰填谷高并发场景下比如秒杀大量请求先进入 RabbitMQ 队列消费端按能力慢慢处理避免直接打垮数据库。为什么要用RabbitMQ简单说如果你的场景是中小并发、需要灵活路由比如按不同条件转发消息、有延迟任务需求选 RabbitMQ如果是高吞吐日志 / 大数据场景选 Kafka如果是国产生态 分布式事务选 RocketMQ。3.在RabbitMQ中怎么保证消息的顺序问题。就比如我有ABC三个消息。我必须要按照ABC进行消费想在 RabbitMQ 中保证 A、B、C 消息严格按顺序消费核心是让消息在同一队列中按序入队 单消费者消费多消费者会打乱顺序这也是 RabbitMQ 保证消息顺序的核心逻辑先明确为什么消息会乱序RabbitMQ本身是采用队列先进先出策略天然保证消息的顺序性。但是以下场景会导致乱序1.多个消费者消费同一个队列就比如A到队列后被消费者1取走B到队列后被消费者2取走如果消费者2处理更快导致B会优先于A完成。2.消息重试或者死信如果A处理失败重新进入队列BC就先被消费。除非引用Redis在代码手动确认A是否被消费如果消费了就执行B,否则就重新进入队列。3.交换机路由到多队列A,B,C被路由到不同队列消费顺序不可控。保证消息顺序的核心方案1.使用RabbitMQ保证消息顺序性核心原则「单队列 单消费者」队列是 RabbitMQ 唯一能保证 FIFO 的组件只要 A、B、C 按顺序进入同一个队列且只有一个消费者消费这个队列就能严格按 A→B→C 顺序处理。但是生产环境很少会出现这样的情况。基本上都是进阶场景需要高并发 保顺序单消费者处理速度慢我们可按 “业务分组” 拆分队列而非多消费者消费同一队列比如按用户 ID 哈希用户 1 的 A、B、C 到队列 1用户 2 的 A、B、C 到队列 2每个队列对应一个消费者既保证单队列顺序又提升整体并发。如果使用RabbitMQ队列保证消息顺序性就需要避免以下操作禁止开启自动确认auto_ackTrue自动确认会导致消费者同时取走多条消息处理快的先完成打乱顺序消息失败不重新入队若 A 处理失败重新入队会到队列尾部B、C 已被消费顺序乱了→ 失败消息丢入死信队列后续人工处理而非重新入队避免延迟队列乱序若用延迟队列同一批次的延迟消息要到同一个延迟队列且消费队列单消费者生产者必须按序发送生产者若异步发送比如多线程发 A、B、C消息入队顺序可能乱→ 生产者单线程按序发送或加锁保证发送顺序。2.通过标识唯一标识A,B,C代码判断是否执行如果没有执行就重新入队列。保证消息顺序性。使用RabbitMQ队列保证消息的顺序性有一定的局限性需要注意的事项很多。所以我们可以使用代码来实现定制化的消息顺序性。1.当生产者生产消息就给消息进行标记例如给 A/B/C 消息添加「阶段标识」stage1/2/3和「全局唯一 ID」比如 task_id1001表示这是同一批任务的第 1/2/3 步2.将状态存储到Redis或者存储到数据库。就比如生产者发送了消息可以根据全局唯一ID存储一条记录设置状态为1。如果是A执行的时候查询状态为1就执行其他BC查询为1就查询进入队列。A执行成功了触发手动确认机制ACK机制进行修改状态。3.消费者进行消费消费者 A只处理 stage1 的消息执行 A 代码完成后更新状态为 “stage1_done”消费者 B只处理 stage2 的消息但消费前先查状态只有 stage1_done 才执行 B 代码否则重新入队等待消费者 C只处理 stage3 的消息消费前查状态只有 stage2_done 才执行 C 代码否则重新入队等待队列拆分可选优化 —— 拆分为 3 个队列queue_a/queue_b/queue_cA 消息发 queue_a、B 发 queue_b、C 发 queue_c每个队列对应一个消费者通过状态依赖控制执行顺序。这个方案既保留了多消费者的灵活性每个消费者专注自己的代码又通过状态依赖保证了整体顺序是分布式系统中 “多消费者 有序执行” 的通用方案。4.RabbitMQ怎么保证不会重复消费我们没有办法保证彻底杜绝重复消费但是可以通过“ACK确认机制”“幂等性设计”让重复消费无业务影响。1.先明确一点RabbitMQ重复消费无法100%杜绝的因为RabbitMQ重复消费的根源是网络不可靠或者系统宕机导致 1). 消费者处理业务但未发ACK,RabbitMQ重推。2). 生产者为收到RabbitMQ的发送确认重发消息。3). 网络延迟导致消息的重试。而我们的目标不是“不让消息重复”而是“重复消费也不影响业务结果”。2.RabbitMQ保证不会重复消费的核心解决方案是1.通过合理的配置ACK确认机制从源头降低重复消费的可能性 关闭自动ACK确认机制严格手动确认ACK。手动确认ACK最好是业务逻辑执行完成幂等标记完成之后才手动调用ACK. 2.业务层面实现幂等性在每条消息添加全局唯一标识消费端先标识是否已处理如果处理过就跳过这样就解决重复消费问题。业务层面实现幂等性可以通过redis或者通过数据库存储幂等性标识。如果使用redis 存储幂等性标识需要注意redis 的过期时间过期时间合理Redis 标记的过期时间要长于消息最大重试周期如消息最多重试 24 小时过期设 1 天5.RabbitMQ 怎么保证消息不会被丢失RabbitMQ消息丢失的核心场景有三个生产者发送消息后消息未成功抵达 RabbitMQ 服务器 生产者丢失RabbitMQ 服务器接收到消息但自身宕机 / 重启导致消息丢失服务器丢失消费者接收到消息但处理过程中宕机消息既没处理完也没确认。消费者丢失1,生产者层面确保消息成功投递到RabbitMQ我们的核心策略是发布确认机制失败重试本地兜底策略。避免消息发送出去就失联了。我们会开启发布确认机制RabbitMQ会在消息成功写入队列后给生产者返回确认而生产者仅收到确认成功后才判定发送成功。如果失败就触发三次重试机制。再次失败会将失败状态缓存到数据库由人工确认。我们的RabbitMQ 在生产者发送消息之前会将这个消息的消息体交换机路由等就存储到数据库。如果生产者返回确认失败了触发重试机制也失败了。将这条数据的状态修改为失败。由人工在页面确认失败原因并手动触发重新投递到RabbitMQ2.RabbitMQ服务器层面确保消息持久化存储我们的核心策略是交换机队列消息三重持久化避免服务器丢失消息。交换机持久化声明时设置durable true队列持久化声明时设置durable true消息持久化发送时设置deliveryMode 2Spring AMQP 默认持久化。RabbitMQ交换机队列和消息三重持久化会导致性能损耗加剧存储压力增大运维成本加大。1.性能明显下降会导致写入延迟。非持久化写入级别达到毫秒级别但是持久化写入级别会提升5-10倍写入时间的速度。在高并发会更明显。2.TPS吞吐量下降官方表明持久化与非持久化的TPS吞吐量达到15。非持久化TPS 可以达到10万TPS, 持久化可以达到2万TPS持久化机制我们要根据平衡可靠性和性能来优化方案核心业务订单、支付开启全持久化 镜像队列接受性能损耗非核心业务日志、通知关闭持久化用内存队列优先保证性能折中方案仅开启队列 / 交换机持久化消息不持久化适合允许少量丢失的场景。3.消费者层面就确保消息处理完成之后再手动触发消息确认机制我们的核心策略就是手动触发ACK消息确认机制死信队列兜底。 给业务队列配置死信队列失败消息转发到死信队列后续人工排查。 在消费者端我们也会有一张表存储发送的消息的状态和消息的内容等。状态有刚到消费者0 和消费成功1 和消费失败2.如果失败了会存储消息失败原因。而且这张表也实现了幂等性的功能。保证了消息重复消费不会影响业务功能。当重复消费查询到数据就不会执行业务代码。6.在RabbitMQ 中我们要不要对全部的消息进行持久化为什么在RabbitMQ中我们绝对不要对全部的消息进行持久化因为我们对全部的消息进行持久化了就会导致性能和TPS吞吐量下降5-10倍的速度。磁盘资源和运维资源增大我们具体要不要对消息的持久化就需要根据消息的业务重要级别进行持久化。我们可以将消息分成核心重要普通级别。只针对核心消息进行三重持久化。重要级别可以持久化交换机和队列。普通级别可以不进行持久化。7.在RabbitMQ 怎么处理消息的堆积问题如果对方问这个问题时首先得和对方确认消息堆积是因为什么原因导致堆积的1.短时间内突发大量消息比如秒杀、活动生产速度远大于消费速度2. 消费者挂了、消费速度慢、消费逻辑耗时久、并发数不够生产紧急处理1.如果是生产上出现这个问题我们可以通过临时扩容消费者复杂现有的消费者代码快速启动多台/多个实例提高消费并发数。让消费速度大于生产速度。2.如果是可以接受延迟情况的消息队列可以将堆积的消息转发到临时队列先消费核心消息后续慢慢处理临时队列 RabbitMQ Web 控制台进行转发到临时队列长期确认但是我们创建这个队列时会综合考虑这个队列的生产会发送多少消息需要多少消费者进行消费才不会导致消息堆积问题1.如果我们这个队列生产者消息会有很多我们就会将这个队列进行拆分成多个小队列每个队列都对应一个消费者进行分解消息队列的消息堆积压力2.我们会在消息队列进行监控预警 提前发现堆积避免问题扩大 监控队列的消息堆积数、消费速率、消费者数量 当堆积数超过阈值比如 1000 条触发告警邮件、短信如果超过阈值就紧急处理1.RabbitMQ 是什么它有哪些主要应用场景2.RabbitMQ的基本架构是什么包括哪些核心组件3.如何在RabbitMQ中声明一个队列有哪些必须的参数4.什么是RabbitMQ中的生产者和消费者5.RabbitMQ的交换机有哪几种类型他们订单工作方式是什么RabbitMQ使用场景1.广播模式SAP系统推送物料基础信息是通过RabbitMQ的广播交换机推送的绑定的全部队列上面。2.

相关新闻

【CTF-crypto-维吉尼亚密码】变种题

【CTF-crypto-维吉尼亚密码】变种题

题目密码表:a b c d e f g h i j k l m n o p q r s t u v w x y z { } a a b c d e f g h i j k l m n o p q r s t u v w x y z { } b b c d e f g h i j k l m n o p q r s t u v w x y z { } a c c d e f g h i j k l m n o p q r s t u v w x y z { } a b d…

2026/7/17 19:16:13 阅读更多 →
小白程序员必看!收藏这份RAG+Agent大模型应用开发速成指南

小白程序员必看!收藏这份RAG+Agent大模型应用开发速成指南

文章指出2026年AI岗位激增12倍,AI应用开发需求增长60%以上,成为IT行业风口。核心抓手是RAGAgent技术,已是大厂面试必考点。 2026年的就业市场正在发生结构性分化: 脉脉数据显示,AI岗位数量同比增长约12倍,在…

2026/7/17 19:14:12 阅读更多 →
小程序毕设项目:校园传统戏曲文化推广微信小程序的设计与实现 戏曲剧目浏览与文化科普小程序的设计与实现 (源码+文档,讲解、调试运行,定制等)

小程序毕设项目:校园传统戏曲文化推广微信小程序的设计与实现 戏曲剧目浏览与文化科普小程序的设计与实现 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/17 19:12:11 阅读更多 →

最新新闻

HarmonyOS掌上记账APP开发实践第29篇:条件渲染与 ForEach — 动态 UI 的构建策略

HarmonyOS掌上记账APP开发实践第29篇:条件渲染与 ForEach — 动态 UI 的构建策略

条件渲染与 ForEach — 动态 UI 的构建策略 一、引言 动态 UI 是现代应用开发的核心需求——不同状态展示不同内容,列表数据动态填充。鸿蒙 ArkTS 提供了 if/else 条件渲染和 ForEach 循环渲染两种声明式渲染控制能力,帮助开发者高效构建动态界面。Mon…

2026/7/17 20:06:33 阅读更多 →
HarmonyOS掌上记账APP开发实践第28篇:自定义组件封装策略 — 从通用 Header 到业务组件的分层设计

HarmonyOS掌上记账APP开发实践第28篇:自定义组件封装策略 — 从通用 Header 到业务组件的分层设计

自定义组件封装策略 — 从通用 Header 到业务组件的分层设计 一、引言 在大型应用中,合理的组件化设计是保证代码可维护性和复用性的基石。鸿蒙的 ArkTS 通过 ComponentV2 装饰器支持自定义组件,允许开发者将页面拆分为可复用的独立模块。MoneyTrack 项…

2026/7/17 20:06:33 阅读更多 →
【关注可白嫖源码】--课程设计--毕业设计--springboot中老年乙肝肝硬化健康管理系统[编号:project14504](案件分析)

【关注可白嫖源码】--课程设计--毕业设计--springboot中老年乙肝肝硬化健康管理系统[编号:project14504](案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 摘 要 本项…

2026/7/17 20:04:32 阅读更多 →
境外海外多语言商城系统app开发

境外海外多语言商城系统app开发

境外多语言商城系统开发要点编辑:araolin(土土哥)市场调研与需求分析 明确目标市场(如欧美、东南亚等),分析当地消费习惯、支付方式(信用卡、本地支付工具如PayPal、AlipayHK)、物流…

2026/7/17 20:04:32 阅读更多 →
题解:洛谷 P17014 [GESP202606 七级] 染色

题解:洛谷 P17014 [GESP202606 七级] 染色

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

2026/7/17 20:04:32 阅读更多 →
Wireshark网络协议分析实战:从抓包到安全排查的完整指南

Wireshark网络协议分析实战:从抓包到安全排查的完整指南

1. 从“看热闹”到“看门道”:为什么你需要掌握Wireshark如果你对网络世界充满好奇,或者正走在网络安全、运维开发的道路上,那么Wireshark这个名字你一定不陌生。它常常被比作网络世界的“显微镜”或“X光机”,能让你亲眼看到数据…

2026/7/17 20:02:32 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/17 3:22:28 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/17 3:01:28 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻