Kafka & RabbitMQ 死信队列(DLQ)超全整合笔记

死信队列(Dead-Letter Queue,DLQ) 死信队列不是 “可有可无” 的附加功能,而是消息队列可靠性架构的 “最后一道防线”。它通过隔离无效消息、追溯问题、支持重试,确保业务在异常场景下仍能稳定运行。 阅读详情

一、死信队列 通用核心概念

1.1 定义

死信队列全称 DLQ(Dead Letter Queue),是消息中间件中专门存放消费失败、重试失效、异常非法消息的「异常消息回收站」。
核心作用:隔离脏消息、不阻塞主业务、留存异常数据用于排查和补偿。

死信队列就是:消息无法被正常消费时,被投递进去的 “存放失败消息” 的队列,可以理解成消息的回收站 / 异常消息仓库。

正常流程:生产者 → 普通队列 → 消费者消费成功,消息消失
死信流程:普通队列里的消息满足死信条件 → 消息变成死信 → 自动转发到死信队列,等待人工处理

消息什么时候会变成死信(常见 3 类条件,RabbitMQ 为例)
  1. 消息被拒绝消费:消费者nack拒绝,并且不重新放回原队列
  2. 消息过期:设置了 TTL 过期时间,超时还没被消费
  3. 队列达到最大长度:队列消息堆满,新消息进不来,头部消息转为死信

💡 注意:死信队列本身也是一个普通队列,只是被普通队列配置成死信接收目的地,它自己也可以有消费者,专门处理异常消息。

死信队列作用
  1. 不阻塞主业务:失败消息不要一直重试霸占主队列,避免正常消息被卡住
  2. 异常隔离:把消费失败的脏消息单独拎出来,不污染正常消息
  3. 事后排查:人工消费死信队列,查看失败原因(日志、参数错误等),修复后重放消息

1.2 消息流转链路

正常链路:生产者 → 普通队列/Topic → 正常消费 → 消息销毁
死信链路:消息触发异常规则 → 转为死信 → 进入DLQ → 人工/程序修复重放

1.3 通用使用场景

  • 消息参数非法、格式错误、业务校验不通过
  • 下游服务异常、接口超时,多次重试依然失败
  • 消息超时未消费、队列积压溢出
  • 防止异常消息无限重试,阻塞整个队列/分区
  • 留存异常数据,用于问题排查、故障修复、数据补偿

二、RabbitMQ 死信队列(DLX)

2.1 核心特性

  • 原生支持 DLX 死信机制
  • Broker 自动判定、自动路由死信消息
  • 无需业务代码硬编码,仅配置即可生效
  • 本质:死信队列就是普通队列,只是被业务队列指定为死信接收队列

2.2 死信触发 3 大硬性条件(面试必考)

  1. 消息被拒绝消费:消费者 nack / reject,且 requeue=false(不重新入队)
  2. 消息超时过期:队列/消息设置 TTL,超时未消费自动变死信
  3. 队列容量打满:队列达到最大长度,队首旧消息被挤出转为死信

2.3 完整工作流程

  1. 创建普通业务队列,配置死信交换机、死信路由键
  2. 创建独立死信队列,绑定死信交换机
  3. 业务消息正常消费则直接销毁,异常则进入死信流程
  4. Broker 自动将异常消息转发至死信交换机
  5. 死信交换机路由消息至死信队列
  6. 监听死信队列,统一排查、修复、重放消息

2.4 优势 & 适用场景

优势:开箱即用、零代码侵入、Broker 自动托管、不阻塞主业务
场景:订单超时关闭、轻量延时任务、简单异常消息隔离、短时业务重试


三、Kafka 死信队列(DLQ)

3.1 核心特性(与 RabbitMQ 最大区别)

  • Kafka 无原生死信机制、无自动路由能力
  • Kafka 的 DLQ 本质就是一个普通 Topic
  • 死信判定、异常拦截、投递全部需要业务手动编码实现
  • 不支持 TTL 过期、队列满溢自动转死信

3.2 Kafka DLQ 触发条件(业务自定义)

  1. 反序列化失败:消息格式错误、字段缺失、JSON/AVRO 解析异常
  2. 业务校验失败:参数非法、数据无效,重试无法修复
  3. 下游服务故障:接口超时、服务宕机、重试次数耗尽
  4. 未知消费异常:消费报错,防止分区阻塞转入死信

3.3 三种主流实现方式

方式1:业务代码手动实现(生产/面试重点)

核心:try-catch 捕获异常,区分可重试 / 不可重试异常

  • 临时异常(超时、网络抖动)→ 投递重试 Topic 延迟重试
  • 永久异常 / 重试耗尽 → 手动投递 DLQ 死信 Topic
  • 必须手动提交 Offset,否则脏消息无限重试、阻塞分区
  • DLQ 消息 Header 必须携带上下文:原Topic、分区、Offset、异常堆栈、时间
方式2:Kafka Connect 内置 DLQ(数据同步场景)

用于 DB、ES 数据同步,无需编码,直接配置:

{
  "errors.tolerance": "all",
  "errors.deadletterqueue.topic.name": "connect-dlq-topic",
  "errors.deadletterqueue.topic.replication.factor": 1,
  "errors.deadletterqueue.context.headers.enable": true
}
方式3:Kafka Streams 流处理 DLQ

流式计算场景,消费报错自动写入 DLQ Topic,留存异常数据。

3.4 生产标准架构(三板斧)

业务Topic → 消费者消费
├─ 临时异常 → 重试Topic(延迟重试)
└─ 重试耗尽/永久异常 → DLQ死信Topic

后续流程:监控告警 → 异常排查 → 修复代码 → 消息重放补偿

3.5 高频踩坑点

  • 未提交Offset:脏消息无限循环消费,分区阻塞、Lag 暴涨
  • DLQ 无上下文:无法追溯报错位置与原因
  • 所有异常直接进死信:临时故障应先重试,不应直接丢弃
  • 无 DLQ 监控:死信堆积无人感知,造成数据丢失

四、RabbitMQ VS Kafka 死信 核心对比(面试必背)

对比维度RabbitMQ(DLX)Kafka(DLQ Topic)
原生支持原生内置,Broker自动路由无原生机制,业务手动实现
触发规则超时、nack拒绝、队列满溢(固定3种)全业务自定义,捕获异常手动投递
消息载体Queue 队列Topic 主题
Offset管理Broker 自动管理开发者手动提交,极易踩坑
代码侵入极低(仅配置)较高(需处理异常、Offset)
适用场景延时任务、轻量业务、异常隔离高并发、大数据流式、长链路业务

五、生产通用 DLQ 处理流程

  1. 监控告警:对 DLQ 消息堆积配置告警,及时发现异常
  2. 异常溯源:通过 Header、日志定位报错原因与原消息位置
  3. 问题修复:修复 Bug、脏数据、下游服务故障
  4. 消息重放:批量重放死信消息,完成业务数据补偿

六、面试一句话总结

  • RabbitMQ 死信:原生 DLX 自动死信,满足超时、拒收、队列满三种条件自动路由,无需编码,适合轻量延时业务。
  • Kafka 死信:无原生支持,靠代码捕获异常、区分重试/死信、手动提交 Offset 实现,灵活性高,适合高并发流式业务。
Springboot使用Rabbitmq的延时队列+死信队列实现消息延期消费 简介简介RabbitMQ 的延时队列(Delayed Queue)是指消息在发送到队列后,会在一定的时间内被延迟处理,直到预设的延迟时间结束,消息才会被消费者消费。RabbitMQ 本身并不原生支持延时队列,但我们可以通过一些插件或特定配置来实现这种功能。延时队列的应用场景定时任务:比如定时发送邮件、推送通知等操作。重试机制:当某些任务失败时,可以让任务在一段时间后再次尝试。延迟消费:在特定时间后消费消息,而不是立即消费。死信队列。 阅读详情

相关推荐

RabbitMq、Kafka、RocketMq整理

MQ的主要作用:异步提高性能、解耦提高扩展性、削峰。

itwxming的博客 2178

消息队列基础概念【七、死信队列(DLQ)与失败消息处理】

死信队列(DLQ)的核心作用与实现机制 死信队列(DLQ)用于隔离无法处理的消息,防止阻塞主流程,常见于消息中间件系统。其核心价值包括: 避免毒丸消息导致无限重试 保留错误数据供后续处理 支持重试策略与合规审计 触发条件: 消息超过最大重试次数 显示拒绝且不重排队 TTL过期或队列超限 数据格式校验失败 典型处理模式: 直接归档(永久性错误) 重试后归档(最常见) 延迟重试链(RabbitMQ的DLX机制) Kafka式独立DLQ主题 主流实现差异: RabbitMQ通过DLX机制在broker层面实现 R

NeoLshu的博客 1203

rabbitmq消息确认机制及死信队列的使用

关于rabbitmq的基本概念和相关的理论这里就不做过多介绍了,在之前的篇幅中有过相应的介绍,也可以查询一些资料详细了解一下rabbitmq的基础知识,下面要介绍的点主要包括两个方面, 1、rabbitmq的消息确认机制; 2、rabbitmq的延时队列,也称作为死信队列的一些研究心得分享 为什么会产生消息确认这个概念呢?其实rabbitmq的模式是我们熟悉的典型的观察者模式的具体实现,或者说是监...

congge 3万+

MQ(消息队列)死信队列(DLQ)

死信队列是消息队列中一种非常重要的机制,能够帮助系统隔离无法处理的消息、解决消息消费异常问题、进行问题排查和调试。在使用MQ时,合理配置和管理死信队列可以提高系统的稳定性和可靠性。

qq_50847694的博客 1762

字符串替换—牛客网(C++实现)

一.题目描述 请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。 给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。 测试样例: “A%sC%sE”,7,[‘...

qq_38358582的博客 1522

Windows 10/11蓝屏急救:SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION报错全攻略(附安全模式+CMD修复)

本文针对Windows 10/11系统常见的SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION蓝屏报错,提供了从诊断到修复的完整解决方案。文章深入剖析了该错误与系统安全功能“内存完整性”及pci.sys驱动的关系,并详细指导用户如何通过安全模式进行基础修复,以及使用命令提示符执行高级系统文件修复和注册表修改,帮助用户彻底解决蓝屏问题并恢复系统稳定。

echo99的专栏 968

死信队列(DLQ)深度解析:原理、配置、实践与系统可靠性保障

摘要: 死信队列(DLQ)是用于存储无法正常投递或消费的消息的普通队列,核心功能包括防止消息丢失、隔离无效消息和支撑问题排查。消息成为死信的三大场景包括处理超时、消费者主动拒绝(不可重试)和队列容量溢出。RabbitMQ通过死信交换机(DLX)和业务队列绑定实现DLQ,配置需声明DLX、DLQ及业务队列,并设置死信路由参数。消费端可通过手动ACK/NACK控制消息流向,异常时拒绝消息并禁止重试以触发死信机制。该机制保障了核心业务的稳定性与可追溯性。

qq_45089709的博客 1421

告别盲目调参:手把手教你用RKISP2.x Tuner理解AWB、AE、NR等核心模块

本文详细介绍了如何使用RKISP2.x Tuner工具进行ISP调试,重点解析AWB、AE、NR等核心模块的调参技巧。通过RV1126平台的实际操作演示,帮助工程师快速掌握可视化对比实验方法,告别盲目调参,提升图像信号处理效率。

weixin_30300225的博客 391

Kafka、RocketMQ、RabbitMQ的比较总结

​ 最近学习了Kafka、RocketMQ、RabbitMQ三款消息中间件的原理,本文主要是记录一下Kafka、RabbitMQ、RocketMQ三款中间件之间的区别。下面先对各自的架构进行简单的介绍,然后详细对比一下他们之间的关键不同点。由于学习时间和个人水平有限,文中错误之处在所难免,敬请指正。 Kafka简介 Producer:生产者,向Kafka集群(Broker)中发送消息 Consumer:消费者,从Kafka集群中(Broker)消费消息 Zookeeper: Zookeeper集群,用来管

weixin_38002497的博客 2万+

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5756

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 253

死信队列(DLQ)深度解析:过期消息、拒绝消息的优雅处理方案

本文深入解析了死信队列(DLQ)在分布式系统中的关键作用与实现机制。死信队列作为消息队列的特殊路由机制,为异常消息提供"不丢失、可追溯、可重试"的安全处理方案。文章详细阐述了三种主要死信产生场景:消息TTL过期、消费端拒绝消息以及队列消息堆积超限。通过RabbitMQ实例,展示了死信队列的完整配置流程,包括普通队列与死信交换机的绑定、死信队列的创建等核心环节。死信队列的设计有效解决了分布式系统中消息失效导致的业务中断问题,为系统可靠性提供了重要保障。

码路同行 923

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1383

死信队列是什么?干什么用的?一文讲透 DLQ 原理与实践

某条消息格式错误,消费者一消费就抛异常,反复重试还是失败;某条消息过期了,还没来得及消费就失去了业务意义;队列堆积满了,新消息被丢弃;下游服务临时故障,消息重试多次仍然无法成功。如果这些“坏消息”一直留在业务队列里,就会导致消费阻塞、无限重试、正常消息被拖累。这时候,就需要一个专门收容这些“问题消息”的地方——死信队列。📌一句话总结:死信队列(Dead Letter Queue,DLQ)是一个专门存放“无法被正常消费的消息”的队列。它的核心作用是隔离坏消息、保留现场、便于排查和补偿。

xiaoyu❅的博客 537

基于STM32L4XX、HAL库的 ATGM336H GPS定位模块驱动程序设计

/ 转换为km/h。// 定位状态: 0=无效, 1=GPS定位, 2=差分定位。// GPS解析数据。支持GPS/BeiDou/GLONASS/Galileo/QZSS多系统联合定位。// 回调函数(需要在HAL_UART_RxCpltCallback中调用)// 地面速度(km/h)// 海拔高度(m)

zhusl6688的博客 793

第17章 后端开发最佳实践 —— OpenSpec + 智能体的工程化实战

后端开发有大量重复性的"样板代码"工作。我们可以创建自定义 Skill,让 AI 自动生成标准的三层架构代码。创建 Skill:后端 CRUD 生成器以 CodeBuddy 为例,在创建:其他工具用户请参考各自文档,了解如何创建自定义 Skills 或类似机制。skill.md## 描述根据实体定义自动生成标准的三层架构代码(Controller-Service-Repository)## 适用场景- 快速创建实体的 CRUD 接口- 保持代码结构一致性- 减少重复性编码工作## 使用方法。

快乐的修补匠的专栏 322

spring cloud stream kafka rabbit 实现死信队列

文章目录前言RabbitMQ实现环境搭建代码演示测试代码Kafka实现环境搭建代码演示测试代码 前言 之前写过一篇,spring kafka 死信队列,这个文章是写的spring kafka的,该篇记录下基于spring cloud stream实现死信队列,方便以后用到的时候翻阅,有不对的地方或者需要改进的地方,还请各位提出。 RabbitMQ实现 环境搭建 还是老规矩使用docker-compose启动,下面先给出脚本,这是搭建了一个集群的方式。 version: "2" services: .

batman 2242

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Kafka、rabbitmq笔记

消费中间件 Kafka 1. 安装单机版Kafka3.0 安装zookeeper https://blog.youkuaiyun.com/qq_55906442/article/details/121764357?spm=1001.2014.3001.5501 安装kafka https://blog.youkuaiyun.com/qq_55906442/article/details/121769929?spm=1001.2014.3001.5502 切记server.properties配置需要添加 listene

weixin_53060535的博客 1364

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

PHP死信队列 (DLQ)的庖丁解牛

死信 (Dead Letter)指的是那些因为某种原因无法被正常消费的消息。死信队列 (DLQ)则是专门存储这些消息的队列。维度核心要点行动指南本质异常隔离区防止坏消息阻塞主流程,保护系统可用性触发/ TTL / 超限代码中明确区分永久/临时错误,控制重试逻辑架构配置队列参数治理监控 -> 报警 -> 修复 -> 回放DLQ 不为空即报警;修复后需有重放机制误区业务逻辑错误进死信业务预期内的失败(如库存不足)应直接 ACK 丢弃,不进死信终极心法死信队列是系统的“急救室”和“法医鉴定中心”

长风破浪会有时的博客 166

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

高级特性 PK:延迟队列、死信队列,三大 MQ 各自怎么实现?

三大主流消息中间件(RabbitMQ、RocketMQ、Kafka)在延迟队列和死信队列实现上差异显著。RabbitMQ通过交换机/队列属性灵活配置,支持自定义延迟但操作复杂;RocketMQ原生支持固定延迟级别和自动死信队列,企业级特性完善;Kafka则需外部机制实现,开发维护成本高。选型需结合业务场景:电商等中小并发场景可选RabbitMQ,高并发分布式系统适合RocketMQ,大数据处理则考虑Kafka。核心差异在于实现方式、延迟精度和易用性。

码路同行 835

死信队列(DLQ)原理与消息中间件实战指南

死信队列(Dead Letter Queue)是分布式系统中处理异常消息的关键组件,其核心原理是通过隔离无法正常处理的消息来保障系统稳定性。在消息中间件架构中,当消息因拒绝、重试超限、TTL过期或队列积压等原因无法消费时,会被自动路由到DLQ存储。这种机制既避免了毒消息影响正常业务流程,又为故障诊断提供了完整现场。从技术实现看,RabbitMQ通过DLX交换机实现原生支持,Kafka需借助重试主题方案,而RocketMQ则自动创建%DLQ%消费组。在电商支付、金融交易等高并发场景中,合理配置DLQ的重试策略

weixin_32642109的博客 235

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

RabbitMQ基础篇(延迟队列和死信队列实战)

weixin_56995925的博客 5134

【大白话说Java面试题 第192题】【08_Kafka篇】第8题:死信队列是什么?延时队列是什么?

本文详解消息队列中死信队列与延时队列的设计原理与应用场景,讲解死信队列处理异常消息的机制,以及延时队列实现定时任务的核心思路,结合Kafka的实现方式介绍两种队列的最佳实践,帮助读者解决分布式系统中的异常消息处理与定时调度问题。

Java后端 | AI智能体应用实战派 | 电脑技能行家 345

死信队列,从死信到死信的死信

在消息系统中,消息消费失败(重试多次,超时收不到ack)是一种必然存在的异常。例如:消费者业务逻辑抛出异常,无法处理消息;消息格式不符合预期,字段缺失;某些系统服务下线、数据库不可用,导致消息积压;队列满了、新消息无法入队;在这些情况下,默认行为是将消息丢弃或者反复尝试消费(根据配置),这显然不够健壮。为了提升系统的稳定性,需要一个机制把这些失败的消息收集起来进行后续处理或报警,这就是死信队列的价值所在。

Daoxifu的博客 3240

RabbitMQ 和 Kafka 对比

RabbitMQ和Kafka是两大主流消息中间件,设计理念和适用场景差异显著。RabbitMQ专注于灵活消息路由与可靠投递,支持多种交换机类型和复杂路由逻辑,适合订单处理、通知推送等业务场景。Kafka则侧重高吞吐数据流处理,采用分区日志存储模型,每秒可处理数十万条消息,适合日志收集、实时分析等大数据场景。关键差异包括:RabbitMQ提供更完善的消息可靠性保障和延迟消息支持,而Kafka在吞吐量、分区扩展性和流处理生态方面更具优势。选型应基于核心需求——业务通信选RabbitMQ,数据流处理选Kafka,

轻骏堂 1413

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 359
上一篇: 1004 To Buy or Not to Buy - Hard Version
下一篇: Spring Data MongoDB Repository 对比笔记
ab123768
博客等级 码龄3年 43粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ab123768

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值