RocketMQ 死信队列(DLQ)实战:原理 + 开发 + 运维 + 架构应用指南
🚀RocketMQ 死信队列(DLQ)实战:原理 + 开发 + 运维 + 架构应用指南
第一章:什么是死信队列(DLQ)?
1.1 死信队列定义
在 RocketMQ 中,死信队列(Dead Letter Queue,简称 DLQ)用于存储那些消费失败且达到最大重试次数的消息。一般情况下,一条消息如果消费失败,RocketMQ 会自动进行多次重试(默认 16 次),如果仍然失败,就会将消息丢入死信队列,避免影响正常消息的消费。
1.2 死信队列的命名规则
RocketMQ 自动为每个消费者组创建死信队列,命名规则:
%DLQ%{consumerGroup}
例如,如果你的消费组是 order-consumer-group
,那么死信队列的 Topic 名称就是:
%DLQ%order-consumer-group
⚠️ 注意:死信队列的消息是不会被原消费者再次消费的,必须新建 Consumer Group 订阅
%DLQ%consumerGroup
才能消费。
1.3 为什么需要死信队列?
- 防止阻塞正常消费
如果没有死信机制,坏消息会反复重试,导致消费堆积,影响系统整体性能。 - 数据可追溯
死信消息是异常数据的沉淀,可以用于后续排查问题、数据修正、补偿处理。 - 系统容错增强
通过死信队列可以做到业务异常的自动隔离,保护系统整体稳定性。
1.4 工作流程图
生产者 --> 正常 Topic --> 消费者|| 消费失败V自动重试 N 次|| 超过最大重试次数V--> 死信队列(DLQ)
第二章:DLQ 实战开发
2.1 工程搭建
2.1.1 Maven 依赖
在 pom.xml
中引入 RocketMQ 相关依赖:
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.3.1</version>
</dependency>
2.1.2 配置文件 application.yml
spring:rocketmq:name-server: 127.0.0.1:9876producer:group: normal-producer-groupconsumer:group: normal-consumer-group
2.2 模拟消费失败进入死信队列
2.2.1 生产者发送消息
package com.example.rocketmq.producer;import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MessageProducer {@Autowiredprivate RocketMQTemplate rocketMQTemplate;public void sendMessage(String topic, String message) {rocketMQTemplate.convertAndSend(topic, message);}
}
2.2.2 消费者模拟异常消费
package com.example.rocketmq.consumer;import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;/*** 正常消费者,故意抛异常,触发重试*/
@Service
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "normal-consumer-group")
public class FailMessageConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String message) {System.out.println("收到消息: " + message);// 故意制造异常,触发重试throw new RuntimeException("模拟消费失败,触发重试!");}
}
2.2.3 触发逻辑
RocketMQ 默认重试 16 次,重试完就进入死信队列 %DLQ%normal-consumer-group
。
2.3 死信队列消费者
我们需要新建一个 Consumer Group 来监听死信队列。
package com.example.rocketmq.consumer;import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;/*** 死信队列监听消费者*/
@Service
@RocketMQMessageListener(topic = "%DLQ%normal-consumer-group", consumerGroup = "dlq-consumer-group")
public class DeadLetterQueueConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String message) {System.out.println("【死信队列】收到消息:" + message);// 在这里进行补偿逻辑,比如修复数据后重新发送}
}
⚠️ 必须使用新的 Consumer Group!不能和原来的 normal-consumer-group 一样。
第三章:CLI 运维排查死信队列
3.1 查看死信消息数量
./mqadmin topicStatus -n 127.0.0.1:9876 -t %DLQ%normal-consumer-group
输出示例:
#Topic: %DLQ%normal-consumer-group
#QueueId: 0
OffsetMax: 10
OffsetMin: 0
LastUpdateTimestamp: 1690000000000
OffsetMax - OffsetMin
就是当前死信消息的总数。
3.2 查询死信消息内容
根据关键字查询:
./mqadmin queryMsgByKey -n 127.0.0.1:9876 -t %DLQ%normal-consumer-group -k your-key
或者根据 MessageId 查询:
./mqadmin queryMsgById -n 127.0.0.1:9876 -i your-message-id
第四章:死信监控与告警实战
推荐使用 RocketMQ Exporter + Prometheus + Grafana:
- RocketMQ Exporter:采集 RocketMQ 各种 Topic 的堆积、TPS 等指标。
- Prometheus:存储和管理监控数据。
- Grafana:可视化仪表盘。
重点监控指标:
- 死信队列 Topic 的消息堆积数。
- Consumer 消费 TPS。
- Broker 存活状态。
- NameServer 存活状态。
监控示例图
(这里可以配一张死信队列监控的 Grafana Dashboard)
第五章:死信队列典型应用场景
场景 | 描述 |
---|---|
电商订单支付通知 | 回调失败,消息进入 DLQ,人工补偿 |
物流轨迹推送失败 | 消息网络波动,异常轨迹推送流入 DLQ |
金融交易通知失败 | 核心交易失败,DLQ 隔离异常,防止系统连锁崩溃 |
大数据 ETL 处理失败 | 处理异常数据集中流入 DLQ,后续修正 |
直播秒杀高并发流控 | 消费失败数据进入 DLQ,防止系统过载 |
第六章:面试必考问题总结
面试题 | 标准回答框架 |
---|---|
什么是死信队列? | 消费失败超过最大重试次数的消息存储队列。 |
死信队列的 Topic 名称? | %DLQ%{consumerGroup} 。 |
如何消费死信消息? | 使用新的 Consumer Group 监听 DLQ Topic。 |
死信队列的应用场景有哪些? | 异常数据隔离,人工补偿,避免阻塞正常消费。 |
死信消息能否重新消费? | 可以,消费后补偿处理,重新发送到原 Topic。 |
第七章:全栈工程师视角:为什么每个微服务系统都必须有死信处理机制?
- 分布式系统中,异常一定会发生,消息队列不能期望 100% 无故障消费。
- 没有死信队列:坏消息反复重试,阻塞正常消费,最终系统不可用。
- 有死信队列:坏消息隔离,正常消息畅通,系统更稳定。
- 补偿机制:死信消息修正后重新投递,减少业务损失。
- 监控报警:死信数量异常增长,快速触发报警,及时发现系统隐患。
第八章:大厂死信队列实践案例总结
在大型互联网公司中,死信队列(DLQ)不仅仅是异常消息隔离的工具,而是整个微服务稳定性保障体系的重要一环。下面来看几个真实的大厂案例。
8.1 京东:秒杀订单处理
背景
京东的秒杀活动中,瞬时高并发导致订单系统巨大的写入压力,偶发的消费失败不可避免。
做法
- 每个秒杀订单创建失败、库存扣减失败的消息,重试达到上限后,进入死信队列。
- 死信队列由后台订单补偿平台统一管理。
- 补偿平台提供:
- 死信消息查询
- 人工审核/修复数据
- 重发到正常 Topic 再次处理
特点
- 保证正常消息不被阻塞,坏数据独立。
- 确保秒杀体验的稳定性和一致性。
- 补偿平台数据可追溯,支持订单回溯和修复。
8.2 美团:支付链路通知补偿
背景
美团支付系统需要向商户推送支付成功、退款等通知,但存在商户网络波动、接口异常等不可控问题。
做法
- 通知发送失败的消息会重试,最终进入死信队列。
- 死信队列监控 + 告警系统:
- 死信堆积达到阈值,自动触发运维报警。
- 定期巡检死信消息,归类整理。
- 统一补偿系统:
- 根据失败原因分流:接口异常、商户拒绝、格式错误。
- 自动补偿简单失败消息,复杂失败消息需要人工干预。
特点
- 死信隔离异常通知,提升主链路可靠性。
- 告警+巡检+自动补偿,高效恢复异常数据。
- 保护支付系统的 SLA(服务等级协议)指标。
8.3 某大型国有银行:金融交易死信处理
背景
金融核心交易对实时性和一致性要求极高,任何消息丢失或堆积都可能带来巨大风险。
做法
- 核心交易消息采用 RocketMQ,开启事务消息机制。
- 消息消费失败,重试后进入死信队列。
- 定制化死信处理平台:
- 自动拉取死信消息,记录审计日志。
- 自动分类处理:网络故障重试,数据错误人工处理。
- 严格权限管控,避免非法操作死信消息。
- 与合规审计系统对接,死信数据纳入审计范围。
特点
- 死信消息入库,保证金融交易数据可追溯。
- 自动+人工结合的补偿机制,降低交易风险。
- 合规要求下,审计合规透明。
第九章:最佳实践总结
实践建议 | 说明 |
---|---|
生产者端保证幂等性 | 消息可能重投,确保幂等防止重复处理。 |
合理配置最大重试次数 | 根据业务特点配置,比如 3次、5次,防止死循环重试。 |
定期巡检死信队列 | 每日定时检查 DLQ,发现并处理异常消息。 |
搭建后台补偿平台 | 支持死信消息查看、修复、重发功能。 |
建立监控告警机制 | 监控死信堆积量,超阈值报警,及时发现消费异常。 |
死信消息分类处理 | 简单异常自动补偿,复杂异常人工审核。 |
与审计系统对接 | 对于金融、电商等重要系统,死信处理过程应全链路可追溯,合规记录。 |
🎯 全文总结
死信队列不仅是消息中间件的“容错保险”,更是微服务体系稳定性的最后防线。通过合理配置、规范使用死信队列,配合监控和补偿平台,可以极大提升系统健壮性、可用性,助力企业应对高并发、高可靠的业务挑战。
相关文章:
RocketMQ 死信队列(DLQ)实战:原理 + 开发 + 运维 + 架构应用指南
🚀RocketMQ 死信队列(DLQ)实战:原理 开发 运维 架构应用指南 第一章:什么是死信队列(DLQ)? 1.1 死信队列定义 在 RocketMQ 中,死信队列(Dead Letter Que…...

Android studio 查看aar源码出现/* compiled code */
如图查看aar源码时看不到具体实现,在排除是sdk版本导致的问题后,下面说解决方法 打开设置,找到插件 输入decompiler 搜索 这个是自带的反编译工具,启用就好了...

用HTML5+JavaScript实现汉字转拼音工具
用HTML5JavaScript实现汉字转拼音工具 前一篇博文(https://blog.csdn.net/cnds123/article/details/148067680)提到,当需要将拼音添加到汉字上面时,用python实现比HTML5JavaScript实现繁琐。在这篇博文中用HTML5JavaScript实现汉…...

基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计
摘要 随着医疗信息化的不断推进以及“互联网医疗”模式的广泛普及,传统医院挂号流程中存在的排队时间长、资源分配不均等问题日益凸显,急需通过数字化手段加以解决。本研究设计并实现了一套基于Java、SpringBoot、Vue与UniAPP技术栈的医院预约挂号微信小…...

ONNX模型的动态和静态量化
引言 通常我们将模型转换为onnx格式之后,模型的体积可能比较大,这样在某些场景下就无法适用。最近想在移动端部署语音识别、合成模型,但是目前的效果较好的模型动辄几个G,于是便想着将模型压缩一下。本文探索了两种压缩方法&…...
PHP 垃圾回收高级特性
PHP 垃圾回收高级特性 1. 循环引用与内存泄漏 单纯的引用计数在遇到循环引用时会导致内存泄漏,主要原因是引用计数无法正确识别那些仅通过循环引用相互关联但实际上已经不可达的对象。 1.1 引用计数的基本原理 引用计数是一种内存管理机制,通过维护每…...
OpenFeign vs MQ:微服务通信如何选型?详解同步与异步的适用场景
OpenFeign vs MQ:微服务通信如何选型?详解同步与异步的适用场景 引言 在微服务架构中,服务之间的通信方式直接影响系统的性能、可靠性和可维护性。常见的通信方式有 OpenFeign(同步HTTP调用) 和 MQ(消息队…...
如何用命令行将 PDF 表格转换为 HTML 表格
本文将介绍如何使用命令行将可填写的 PDF 表单转换为 HTML 表单。只需几行代码即可完成转换。将可填写的 PDF 表单转换为 HTML 表单后,你可以在网页上显示这些表单。本指南使用 FormVu 来演示转换过程。 使用命令行将可填写 PDF 表单转换为 HTML 表单 你可以通过命…...
html5的响应式布局的方法示例详解
以下是HTML5实现响应式布局的5种核心方法及代码示例: 1. 媒体查询(核心方案) /* 默认样式(移动优先) */ .container {padding: 15px; }/* 中等屏幕(平板) */ @media (min-width: 768px) {.container {padding: 30px;max-width: 720px;} }/* 大屏幕(桌面) */ @media …...

如何用Python抓取Google Scholar
文章目录 [TOC](文章目录) 前言一、为什么要抓取Google Scholar?二、Google Scholar 抓取需要什么三、为什么代理对于稳定的抓取是必要的四、一步一步谷歌学者抓取教程4.1. 分页和循环4.2. 运行脚本 五、完整的Google Scholar抓取代码六、抓取Google Scholar的高级提…...
电脑革命家测试版:硬件检测,6MB 轻量无广告 清理垃圾 + 禁用系统更新
各位电脑小白和大神们,我跟你们说啊!有个超牛的东西叫电脑革命家测试版,这是吾爱破解论坛的开发者搞出来的免费无广告系统工具集合,主打硬件检测和系统优化,就像是鲁大师这些软件的平替。下面我给你们唠唠它的核心功能…...

Wireshark对usb设备进行抓包找不到USBPcap接口的解决方案
引言 近日工作需要针对usb设备进行抓包,但按照wireshark安装程序流程一步步走,即使勾选了安装USBPcap安装完成后开启wireshark依然不显示USBPcap接口,随设法进行解决。 最终能够正常显示USBPcap接口并能够正常使用进行抓包 解决方案&#x…...
题目 3298: 蓝桥杯2024年第十五届决赛真题-兔子集结
题目 3298: 蓝桥杯2024年第十五届决赛真题-兔子集结 时间限制: 2s 内存限制: 192MB 提交: 2499 解决: 309 题目描述 在森林幽静的一隅,有一村落居住着 n 只兔子。 某个月光皎洁的夜晚,这些兔子列成一队,准备开始一场集结跳跃活动。村落中…...
Unity开发之Webgl自动更新程序包
之前让客户端更新webgl程序是在程序里写版本号然后和服务器对比,不同就调用 window.location.reload(true);之前做的客户端都是给企业用,用户数少看不出来啥问题。后来自己开发一个小网站,用户数量还是挺多,然后就会遇到各种各样的…...
深入理解设计模式之状态模式
深入理解设计模式之:状态模式(State Pattern) 一、什么是状态模式? 状态模式(State Pattern)是一种行为型设计模式。它允许一个对象在其内部状态发生改变时,改变其行为(即表现出不…...

Socket 编程 UDP
目录 1. UDP网络编程 1.1 echo server 1.1.1 接口 1.1.1.1 创建套接字 1.1.1.2 绑定 1.1.1.3 bzero 1.1.1.4 htons(主机序列转网络序列) 1.1.1.5 inet_addr(主机序列IP转网络序列IP) 1.1.1.6 recvfrom(让服务…...

Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本
Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本 1、需求: 1、Jenkins服务器在74上,Python脚本在196服务器上 2、需要在服务器74的Jenkins上调用196上的脚本执行Python自动化测试 2、操作步骤 第一步:Linux Centos7配置SSH免密登录 Linux Centos7配置S…...
Spring AI系列之Spring AI 集成 ChromaDB 向量数据库
1. 概述 在传统数据库中,我们通常依赖精确的关键词或基本的模式匹配来实现搜索功能。虽然这种方法对于简单的应用程序已经足够,但它无法真正理解自然语言查询背后的含义和上下文。 向量存储解决了这一限制,它通过将数据以数值向量的形式存储…...

lua的注意事项2
总之,下面的返回值不是10,a,b 而且...
主流电商平台的反爬机制解析
随着数据成为商业决策的重要资源,越来越多企业和开发者希望通过技术手段获取电商平台的公开信息,用于竞品分析、价格监控、市场调研等。然而,主流电商平台如京东、淘宝(含天猫)等为了保护数据安全和用户体验࿰…...

前端八股之HTML
前端秘籍-HTML篇 1. src和href的区别 src 用于替换当前元素,href 用于在当前文档和引用资源之间确立联系。 (1)src src 是 source 的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置࿱…...
tiktoken学习
1.tiktoken是OpenAI编写的进行高效分词操作的库文件。 2.操作过程: enc tiktoken.get_encoding("gpt2") train_ids enc.encode_ordinary(train_data) val_ids enc.encode_ordinary(val_data) 以这段代码为例,get_encoding是创建了一个En…...

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程
Rainbond V6 国产化部署教程,针对鲲鹏 CPU 麒麟 V10 的离线环境,手把手教你从环境准备到应用上线,所有依赖包提前打包好,步骤写成傻瓜式操作指南。别说技术团队了,照着文档一步步来,让你领导来都能独立完成…...
历年厦门大学计算机保研上机真题
2025厦门大学计算机保研上机真题 2024厦门大学计算机保研上机真题 2023厦门大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 数字变换过程的最大值与步数 题目描述 输入一个数字 n n n,如果 n n n 是偶数就将该偶数除以 2 2 2&…...

【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章将开启Qt的学习,Qt是一个较为古老但仍然在GUI图形化界面设计中有着举足轻重的地位,因为它适合嵌入式和多种平台而被广泛使用…...

IoT/HCIP实验-1/物联网开发平台实验Part2(HCIP-IoT实验手册版)
文章目录 概述产品和设备实例的产品和设备产品和设备的关联单个产品有多个设备为产品创建多个设备产品模型和物模型设备影子(远程代理) 新建产品模型定义编解码插件开发编解码插件工作原理消息类型与二进制码流添加消息(数据上报消息…...

Replacing iptables with eBPF in Kubernetes with Cilium
source: https://archive.fosdem.org/2020/schedule/event/replacing_iptables_with_ebpf/attachments/slides/3622/export/events/attachments/replacing_iptables_with_ebpf/slides/3622/Cilium_FOSDEM_2020.pdf 使用Cilium,结合eBPF、Envoy、Istio和Hubble等技术…...
推荐系统排序指标:MRR、MAP和NDCG
文章目录 MRR: Mean Reciprocal RankMAP: Mean Average PrecisionNDCG: Normalized Discounted Cumulative Gain3个度量标准来自于两个度量家族。第一种度量包括基于二进制相关性的度量。这些度量标准关心的是一个物品在二进制意义上是否是好的。第二个系列包含基于应用的度量。…...

数学建模之最短路径问题
1 问题的提出 这个是我们的所要写的题目,我们要用LINGO编程进行编写这个题目,那么就是需要进行思考这个怎么进行构建这个问题的模型 首先起点,中间点,终点我们要对这个进行设计 2 三个点的设计 起点的设计 起点就是我们进去&am…...

测试概念 和 bug
一 敏捷模型 在面对在开发项目时会遇到客户变更需求以及合并新的需求带来的高成本和时间 出现的敏捷模型 敏捷宣言 个人与交互重于过程与工具 强调有效的沟通 可用的软件重于完备的文档 强调轻文档重产出 客户协作重于合同谈判 主动及时了解当下的要求 相应变化…...