RabbitMQ的死信队列的产生与处理

死信队列(Dead Letter Queue, DLQ)

1. 死信(Dead Letter)是怎么产生的?

在 RabbitMQ 中,消息会变成 死信(Dead Letter)的常见情况有以下几种:

  • 消息被拒绝(Rejection)未被重新入队(requeue = false)

    • 当消费者使用 basic.rejectbasic.nack 拒绝消息,并且 requeue 参数设置为 false 时,RabbitMQ 不会重新投递这条消息,而是将其送入死信队列。
  • 消息过期(TTL 过期)

    • 如果队列或消息本身设置了 TTL(Time-To-Live),当消息存活时间超过 TTL 限制时,消息会被认为是死信。
  • 队列达到最大长度(队列满了)

    • 如果队列设置了 最大长度x-max-length)或 最大字节数x-max-length-bytes),当队列达到这个限制时,新来的消息会导致旧消息变成死信。
2. 如何合理地处理死信?

(1)使用死信交换机(DLX, Dead Letter Exchange)

RabbitMQ 允许我们给队列绑定一个死信交换机(DLX),当消息变成死信时,会被自动转发到 死信交换机 ,然后路由到 死信队列(DLQ)。

配置示例:

复制代码
# 创建一个普通队列,并绑定死信交换机
rabbitmqctl set_policy DLX "my-queue" '{"dead-letter-exchange":"dlx-exchange"}' --apply-to queues

这样,my-queue 里的死信消息会被转发到 dlx-exchange 处理。

(2)监控 & 处理死信队列

  • 定期检查 死信队列,找出死信产生的原因。
  • 在死信队列中,可以设置一个消费者来做 重试、记录日志、人工处理 等操作。
  • 结合 TTL + DLX 机制 ,可以实现 延迟消息队列

(3)调整 RabbitMQ 配置,减少死信

  • 合理设置 TTL,避免消息过早进入死信队列。
  • 增加队列长度,防止因队列满了导致消息变成死信。
  • 正确使用 basic.nackbasic.reject,避免误将消息变成死信。

延时队列:

延时队列场景举例:

预定一个会议室,两个小时后开始,要求提前十分钟通知参会人员进行开会。

如果不使用延时队列,那么就需要不断轮询,查看是否到达需要通知的时间,进行消息通知。

延时队列的实现方式:

死信队列+消息有效期

预定时间到提前十分钟通知中间有110分钟,那么创建一条通知消息,设置有效期110分钟丢入队列,不用消费者去监听,等待消息过期后路由到指定的死信队列,再去消费死信队列中的消息即可。
所以延时队列实际上是一种实现方案,而不是一种特定的队列类型。

总结

死信消息(Dead Letter)通常是由于消息被拒绝、过期、队列满了等情况产生的。合理的处理方式是 绑定死信交换机(DLX)+ 监控死信队列 ,这样可以对死信进行 重试、日志分析 ,甚至用于 延迟消息 的场景。

相关推荐
网络工程小王35 分钟前
【HCIE-AI】12.deepspeed分布式并行训练进阶版
人工智能·pytorch·分布式·学习·昇腾·deepspeed
ACP广源盛139246256733 小时前
国产算力互联IX8024@ACP#Kimi K3 开源后的端侧部署硬件架构分析
大数据·人工智能·分布式·单片机·嵌入式硬件
花生了什么事o4 小时前
分布式 ID 生成方案:从数据库自增到雪花算法
数据库·分布式·算法
爱吃提升19 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
ZENERGY-众壹1 天前
跨品牌逆变器升级:华为锦浪德业 API 对接的 7 个坑
分布式·华为·数据归一化·光伏运维·逆变器api
薛定谔的猫19821 天前
LLaMA-Factory +DeepSpeed 分布式多卡训练实战全解
分布式·deepspeed·zero·多卡训练·多卡分布式训练
稚南城才子,乌衣巷风流1 天前
RabbitMQ 消息队列:从入门到实战
分布式·rabbitmq
Database_Cool_2 天前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
肥胖小羊2 天前
解决企业微信 AccessToken 刷新并发冲突的分布式锁机制实践
分布式·企业微信
过期动态2 天前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq