超全整合笔记)
Kafka RabbitMQ 死信队列DLQ超全整合笔记一、死信队列 通用核心概念1.1 定义消息什么时候会变成死信常见 3 类条件RabbitMQ 为例死信队列作用1.2 消息流转链路1.3 通用使用场景二、RabbitMQ 死信队列DLX2.1 核心特性2.2 死信触发 3 大硬性条件面试必考2.3 完整工作流程2.4 优势 适用场景三、Kafka 死信队列DLQ3.1 核心特性与 RabbitMQ 最大区别3.2 Kafka DLQ 触发条件业务自定义3.3 三种主流实现方式方式1业务代码手动实现生产/面试重点方式2Kafka Connect 内置 DLQ数据同步场景方式3Kafka Streams 流处理 DLQ3.4 生产标准架构三板斧3.5 高频踩坑点四、RabbitMQ VS Kafka 死信 核心对比面试必背五、生产通用 DLQ 处理流程六、面试一句话总结一、死信队列 通用核心概念1.1 定义死信队列全称DLQDead Letter Queue是消息中间件中专门存放消费失败、重试失效、异常非法消息的「异常消息回收站」。核心作用隔离脏消息、不阻塞主业务、留存异常数据用于排查和补偿。死信队列就是消息无法被正常消费时被投递进去的 “存放失败消息” 的队列可以理解成消息的回收站 / 异常消息仓库。正常流程生产者 → 普通队列 → 消费者消费成功消息消失死信流程普通队列里的消息满足死信条件 → 消息变成死信 → 自动转发到死信队列等待人工处理消息什么时候会变成死信常见 3 类条件RabbitMQ 为例消息被拒绝消费消费者nack拒绝并且不重新放回原队列消息过期设置了 TTL 过期时间超时还没被消费队列达到最大长度队列消息堆满新消息进不来头部消息转为死信 注意死信队列本身也是一个普通队列只是被普通队列配置成死信接收目的地它自己也可以有消费者专门处理异常消息。死信队列作用不阻塞主业务失败消息不要一直重试霸占主队列避免正常消息被卡住异常隔离把消费失败的脏消息单独拎出来不污染正常消息事后排查人工消费死信队列查看失败原因日志、参数错误等修复后重放消息1.2 消息流转链路正常链路生产者 → 普通队列/Topic → 正常消费 → 消息销毁死信链路消息触发异常规则 → 转为死信 → 进入DLQ → 人工/程序修复重放1.3 通用使用场景消息参数非法、格式错误、业务校验不通过下游服务异常、接口超时多次重试依然失败消息超时未消费、队列积压溢出防止异常消息无限重试阻塞整个队列/分区留存异常数据用于问题排查、故障修复、数据补偿二、RabbitMQ 死信队列DLX2.1 核心特性原生支持 DLX 死信机制Broker 自动判定、自动路由死信消息无需业务代码硬编码仅配置即可生效本质死信队列就是普通队列只是被业务队列指定为死信接收队列2.2 死信触发 3 大硬性条件面试必考消息被拒绝消费消费者 nack / reject且 requeuefalse不重新入队消息超时过期队列/消息设置 TTL超时未消费自动变死信队列容量打满队列达到最大长度队首旧消息被挤出转为死信2.3 完整工作流程创建普通业务队列配置死信交换机、死信路由键创建独立死信队列绑定死信交换机业务消息正常消费则直接销毁异常则进入死信流程Broker 自动将异常消息转发至死信交换机死信交换机路由消息至死信队列监听死信队列统一排查、修复、重放消息2.4 优势 适用场景优势开箱即用、零代码侵入、Broker 自动托管、不阻塞主业务场景订单超时关闭、轻量延时任务、简单异常消息隔离、短时业务重试三、Kafka 死信队列DLQ3.1 核心特性与 RabbitMQ 最大区别Kafka 无原生死信机制、无自动路由能力Kafka 的 DLQ 本质就是一个普通 Topic死信判定、异常拦截、投递全部需要业务手动编码实现不支持 TTL 过期、队列满溢自动转死信3.2 Kafka DLQ 触发条件业务自定义反序列化失败消息格式错误、字段缺失、JSON/AVRO 解析异常业务校验失败参数非法、数据无效重试无法修复下游服务故障接口超时、服务宕机、重试次数耗尽未知消费异常消费报错防止分区阻塞转入死信3.3 三种主流实现方式方式1业务代码手动实现生产/面试重点核心try-catch 捕获异常区分可重试 / 不可重试异常临时异常超时、网络抖动→ 投递重试 Topic延迟重试永久异常 / 重试耗尽 → 手动投递DLQ 死信 Topic必须手动提交 Offset否则脏消息无限重试、阻塞分区DLQ 消息 Header 必须携带上下文原Topic、分区、Offset、异常堆栈、时间方式2Kafka 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}方式3Kafka Streams 流处理 DLQ流式计算场景消费报错自动写入 DLQ Topic留存异常数据。3.4 生产标准架构三板斧业务Topic → 消费者消费├─ 临时异常 → 重试Topic延迟重试└─ 重试耗尽/永久异常 → DLQ死信Topic后续流程监控告警 → 异常排查 → 修复代码 → 消息重放补偿3.5 高频踩坑点未提交Offset脏消息无限循环消费分区阻塞、Lag 暴涨DLQ 无上下文无法追溯报错位置与原因所有异常直接进死信临时故障应先重试不应直接丢弃无 DLQ 监控死信堆积无人感知造成数据丢失四、RabbitMQ VS Kafka 死信 核心对比面试必背对比维度RabbitMQDLXKafkaDLQ Topic原生支持原生内置Broker自动路由无原生机制业务手动实现触发规则超时、nack拒绝、队列满溢固定3种全业务自定义捕获异常手动投递消息载体Queue 队列Topic 主题Offset管理Broker 自动管理开发者手动提交极易踩坑代码侵入极低仅配置较高需处理异常、Offset适用场景延时任务、轻量业务、异常隔离高并发、大数据流式、长链路业务五、生产通用 DLQ 处理流程监控告警对 DLQ 消息堆积配置告警及时发现异常异常溯源通过 Header、日志定位报错原因与原消息位置问题修复修复 Bug、脏数据、下游服务故障消息重放批量重放死信消息完成业务数据补偿六、面试一句话总结RabbitMQ 死信原生 DLX 自动死信满足超时、拒收、队列满三种条件自动路由无需编码适合轻量延时业务。Kafka 死信无原生支持靠代码捕获异常、区分重试/死信、手动提交 Offset 实现灵活性高适合高并发流式业务。