Kafka的死信队列

死信队列(Dead-Letter Queue,DLQ)就是消息的"太平间" ------

正常队列里"死掉"的消息,统一拉到这儿来,方便后续排查、重试或人工干预,而不是直接扔掉。


一、消息是怎么"死"的

  1. 重试次数用尽

    消费失败,系统重投 3~5 次仍报错 → 认为"救不活"。

  2. TTL 过期

    消息在队列里待的时间超过设定的存活期(Time-To-Live)。

  3. 队列长度超限

    队列满,最早的消息被"挤"出来。

  4. 手动否定

    业务代码明确 basic.reject / basic.nackrequeue=false


二、死信后的流程(以 RabbitMQ 为例)

复制代码
          ┌------------ 正常业务队列 ------------┐
          │                                       │
          │  x-dead-letter-exchange = "dlx.exchange" │
          │  x-dead-letter-routing-key = "dlq.key"  │
          ▼                                       │
   消费失败/过期/超限 → 消息被 reject/nack → RabbitMQ 自动转发 → 死信队列(DLQ)
                                                             │
                                                             ▼
                                                    死信消费者(日志、告警、人工补单)

三、代码片段(RabbitMQ)

java 复制代码
// 1. 声明正常队列时绑定死信参数
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx.exchange");
args.put("x-dead-letter-routing-key", "dlq.key");
args.put("x-message-ttl", 30000);          // 30 秒没消费就过期进 DLQ
channel.queueDeclare("business.queue", true, false, false, args);

// 2. 声明死信交换机和队列
channel.exchangeDeclare("dlx.exchange", "direct");
channel.queueDeclare("dead.queue", true, false, false, null);
channel.queueBind("dead.queue", "dlx.exchange", "dlq.key");

四、Kafka 里的 DLQ

Kafka 没有原生 DLQ,客户端自己实现
spring-kafkaSeekToCurrentErrorHandler

重试 N 次后把消息发到名为 xxx.DLT(Dead-Letter Topic)的 topic,效果一样。


五、死信队列用来干啥

  • 记录+报警:消息进 DLQ 立刻发钉钉/邮件。
  • 人工修复:运营后台拉取 DLQ 内容,补发或修正数据。
  • 二次重试:DLQ 消费者等系统空闲再把消息写回原队列。

一句话:
死信队列 = 正常队列的" ICU 病房" ,专门收容那些救不活 的消息,让它们死得明白、死得有价值,而不是无声无息地消失。

相关推荐
旷世奇才李先生6 分钟前
Redis 7\.0实战:分布式缓存与高可用集群搭建全指南
redis·分布式·缓存
_Evan_Yao19 小时前
内存映射文件与零拷贝:Kafka、RocketMQ 飞升的秘密通道
分布式·kafka·rocketmq
与遨游于天地20 小时前
分布式锁从Redis到Redisson的演进
数据库·redis·分布式
Francek Chen1 天前
【大数据存储与管理】实验3:熟悉常用的HBase操作
大数据·数据库·分布式·hbase
七夜zippoe1 天前
DolphinDB分布式表:创建与管理
数据库·分布式·维度·dolphindb·数据写入
KmSH8umpK1 天前
Redis分布式锁进阶第十七篇
数据库·redis·分布式
fengxin_rou1 天前
JVM 内存结构与内存溢出 / 泄漏问题全解析
java·开发语言·jvm·分布式·rabbitmq
gQ85v10Db2 天前
Redis分布式锁进阶第十七篇:微服务分布式锁全局治理 + 跨团队统一规范落地 + 全链路稳定性提升方案
redis·分布式·微服务
gQ85v10Db2 天前
Redis分布式锁进阶第十八篇:本地缓存+分布式锁双锁架构 + 高并发削峰兜底 + 极致性能无损优化实战
redis·分布式·缓存
小江的记录本2 天前
【Kafka核心】Kafka高性能的四大核心支柱:零拷贝、批量发送、页缓存、压缩
java·数据库·分布式·后端·缓存·kafka·rabbitmq