RabbitMQ消息队列落地:可靠性投递与重复消费问题解决
帮客户落地RabbitMQ3个可靠性投递与重复消费实战要点前不久帮一个做招聘SaaS的客户搞了个项目他们的核心业务是职位信息同步。客户那边有几个数据源每天要定时从不同的招聘网站把最新的职位数据同步到自己的平台上同时还要把平台上的职位状态变更推送给外部系统。原来的方案是用数据库轮询Kafka但运维成本和网络开销扛不住了特别是网络抖动频繁导致数据不一致。客户希望引入RabbitMQ来解耦要求消息不能丢而且不能重复消费。项目规模大概是每天处理50万条消息峰值3000条/秒左右。可靠性投递生产端确认机制一开始我觉得RabbitMQ设个手动ACK就完事了结果发现生产端才是第一道鬼门关。测试的时候模拟了断网、Broker宕机发现消息在发送过程中就丢了消费者那边连个影子都没见到。当时有两种选择事务机制和publisher confirm机制。RabbitMQ的事务确实能保证不丢消息但性能损耗太大了实测TPS直接掉到原来的三分之一还多。我最后选了publisher confirm异步回调的方案虽然代码复杂度上去了但性能和可靠性都能兼顾。核心代码大概长这样java// 开启确认模式channel.confirmSelect();// 发送消息的回调channel.addConfirmListener(new ConfirmListener() {Overridepublic void handleAck(long deliveryTag, boolean multiple) throws IOException {// 确认成功从本地缓冲中移除if (multiple) {// 批量确认messageBuffer.headMap(deliveryTag 1).clear();} else {messageBuffer.remove(deliveryTag);}}Overridepublic void handleNack(long deliveryTag, boolean multiple) throws IOException {// 确认失败从本地缓冲取出重发Map failed multiple ?messageBuffer.headMap(deliveryTag 1) :Map.of(deliveryTag, messageBuffer.get(deliveryTag));retryFailedMessages(failed);}});这里有个差点踩进去的坑批量确认模式下handleAck里的deliveryTag是最后一个确认的消息编号我当时直接按单个消息去清理缓冲区结果一堆消息被重复确认了。查了两天才意识到需要用headMap截断。重复消费幂等性设计是最后防线消费者端重复消费的问题更恶心。客户那边的业务场景是这样的用户提交简历后系统要异步发送邮件通知、更新数据库状态、记录操作日志。如果一条消息被消费两次数据库状态会脏邮件会重复发。有意思的是网上很多人说用Redis分布式锁就能解决但我试了一圈发现在消息量大的时候Redis锁的过期时间很难控制。锁太短会失效锁太长性能又不行。最后我选了业务层幂等设计用数据库唯一索引本地消息表来兜底。具体做法是消息体里带一个全局唯一的消息ID用UUID就行消费者先查本地消息表如果这个ID已经处理过就直接ACK跳过。同时数据库里对“业务唯一标识业务类型”建联合唯一索引双重保险。java// 消费者幂等判断public boolean isDuplicate(String messageId, String businessType) {// 使用数据库唯一索引做幂等// 表结构message_id business_type statusreturn duplicateCheckService.exist(messageId, businessType);}// 处理消息public void handleMessage(MessageData data) {if (isDuplicate(data.getMessageId(), data.getBusinessType())) {// 重复消息直接确认channel.basicAck(envelope.getDeliveryTag(), false);return;}// 执行业务逻辑try {processBusinessLogic(data);// 记录消息处理日志duplicateCheckService.save(data.getMessageId(), data.getBusinessType());channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 业务失败进入重试逻辑channel.basicNack(envelope.getDeliveryTag(), false, true);}}坑死了的一件事是一开始我把消息ID放到消息头部消费者出来后再组装。结果有一次消费者代码把消息头部的类型搞混了所有消息都被判断成重复。老老实实把ID放到消息体里用JSON解析虽然多了一点序列化开销但至少不会出这种低级错误。可靠重试死信队列配合TTL还有一个问题是消息处理失败后的重试策略。客户要求普通失败重试3次每次间隔5分钟连续失败后进入死信队列人工介入。我一开始用RabbitMQ的重试插件但在3.13版本下发现插件和Spring Boot的集成有点发神经某些情况下回导致消费者无限重试。最后改用手动TTL死信交换机的方案java// 声明主队列Map args new HashMap();args.put(x-dead-letter-exchange, dlx.exchange);args.put(x-dead-letter-routing-key, dlx.routing.key);args.put(x-message-ttl, 5601000); // 5分钟TTLchannel.queueDeclare(business.queue, true, false, false, args);// 声明重试队列Map retryArgs new HashMap();retryArgs.put(x-dead-letter-exchange, );retryArgs.put(x-dead-letter-routing-key, business.queue);retryArgs.put(x-message-ttl, 5601000);channel.queueDeclare(retry.queue, true, false, false, retryArgs);消费者处理失败后不直接重试而是把消息发到死信交换机等TTL过期后自动回到原队列。每重试一次消息头里记录重试次数超过3次就转发到真正的死信队列。说实话这个方案比插件稳定多了但是调试的时候需要特别注意死信交换机的路由规则我一开始箭头指错了消息直接石沉大海。最后总结一下RabbitMQ的可靠性投递核心就三件事生产端用confirm机制、消费端用幂等、重试用TTL配合死信。不要迷信复杂方案数据库唯一索引是最靠谱的幂等方案。本文基于实际项目经验整理如有技术问题欢迎私信交流。

相关新闻

基于TPS61170与PIC18F4585的高效智能升压电源设计

基于TPS61170与PIC18F4585的高效智能升压电源设计

1. 项目背景与核心需求解析在嵌入式系统开发中,我们经常遇到需要将低电压转换为高电压的场景。比如在工业控制领域,24V/36V的传感器供电;在医疗设备中,需要为某些特殊模块提供高压电源;甚至在一些创意电子项目中&#…

2026/7/10 17:34:07 阅读更多 →
Windows下R与RStudio稳定安装指南:Rtools45配置与镜像优化

Windows下R与RStudio稳定安装指南:Rtools45配置与镜像优化

1. 为什么在Windows上装R和RStudio,不是点下一步就完事?你搜“window环境下R和RStudio安装教程”,大概率是刚接触数据分析、统计建模或生物信息学的新手,手头一台Win10/Win11电脑,想跑通第一个hist(rnorm(100))却卡在第…

2026/7/10 17:34:07 阅读更多 →
statig泛型支持:构建灵活可复用的状态机组件

statig泛型支持:构建灵活可复用的状态机组件

statig泛型支持:构建灵活可复用的状态机组件 【免费下载链接】statig Hierarchical state machines for designing event-driven systems 项目地址: https://gitcode.com/gh_mirrors/st/statig 在构建复杂的事件驱动系统时,状态机是不可或缺的设计…

2026/7/10 17:34:07 阅读更多 →

最新新闻

TDA7468与STM32F745VG构建高性能音频处理系统

TDA7468与STM32F745VG构建高性能音频处理系统

1. 音频处理系统的核心组件解析在构建高性能音频处理系统时,TDA7468和STM32F745VG的组合提供了一个理想的解决方案。TDA7468是STMicroelectronics推出的一款专业级音频处理器,而STM32F745VG则是ST的Cortex-M7内核微控制器,两者的结合能够充分…

2026/7/10 18:27:02 阅读更多 →
OpenClaw v2026.5.2 稳定性升级:减负重构与实时智能中枢

OpenClaw v2026.5.2 稳定性升级:减负重构与实时智能中枢

1. 项目概述:这不是一次普通更新,而是一次“减负式重构”“OpenClaw v2026.5.2 更新:少折腾,多在线!这次升级真的稳定了”——这个标题里藏着三个关键信号:少折腾、多在线、真的稳定。它不是在喊口号&#…

2026/7/10 18:27:02 阅读更多 →
AutoKernel vs 传统优化:深度学习算子开发效率对比与性能测试

AutoKernel vs 传统优化:深度学习算子开发效率对比与性能测试

AutoKernel vs 传统优化:深度学习算子开发效率对比与性能测试 【免费下载链接】AutoKernel AutoKernel 是一个简单易用,低门槛的自动算子优化工具,提高深度学习算法部署效率。 项目地址: https://gitcode.com/gh_mirrors/au/AutoKernel …

2026/7/10 18:23:00 阅读更多 →
【记录】从0开始创建Linux宝塔面板并部署python flask+mysql项目

【记录】从0开始创建Linux宝塔面板并部署python flask+mysql项目

目录 1 创建云服务器 2 云服务器配置 3 部署python项目 1 创建云服务器 由于没有截图了我就简单说明一下: ①在一些云服务器官网选择产品,我选择的是 云服务器ECS个人版(可以先用试用云服务器去尝试)。 ②立即试用后到选择界…

2026/7/10 18:18:59 阅读更多 →
产业全景解读:太空算力、国产芯、国产大模型、6G 空天地、AI 可信身份、后量子安全多线全面突破

产业全景解读:太空算力、国产芯、国产大模型、6G 空天地、AI 可信身份、后量子安全多线全面突破

标签:太空算力、神经动力学芯片、Kimi GLM、6G 全光基站、AI-eSIM、空天地组网、后量子密码、AI 医疗安全、AI 供应链安全 阅读时长:12 分钟前言2026 年年中 AI、通信、网络安全三大赛道同步释放 9 项重磅产业里程碑,覆盖太空全域算力新赛道、…

2026/7/10 18:18:59 阅读更多 →
Java-AES-Crypto安全审计:如何确保加密实现的安全性

Java-AES-Crypto安全审计:如何确保加密实现的安全性

Java-AES-Crypto安全审计:如何确保加密实现的安全性 【免费下载链接】java-aes-crypto A simple Android class for encrypting & decrypting strings, aiming to avoid the classic mistakes that most such classes suffer from. 项目地址: https://gitcode…

2026/7/10 18:10:16 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻