RabbitMQ-TTL-死信队列_DLX
1. 简介
死信队列,简称:DLX
,Dead Letter Exchange
(死信交换机),当消息成为Dead message
后,可以被重新发送到另外一个交换机,这个交换机就是DLX
。
(一般会将DLX和与其binding 的 Queue,一并称为死信队列或DLX,习惯而已,不必纠结)
那么什么情况下会成为Dead message
?
- 队列的长度达到阈值。
- 消费者拒接消费消息,
basicNack/basicReject
,并且不把消息重新放入原目标队列,requeue=false
。 - 原队列存在消息过期设置,消息到达超时时间未被消费。
流程讲解,如图所示(以第三种情况为例):
Producer
发送一条消息到Exchange
并路由到设有过期时间(假设30分钟)的Queue
中。- 当消息的存活时间超过了30分钟后,
Queue
会将消息转发给DLX
。 DLX
接收到Dead message
后,将Dead message
路由到与其绑定的Queue
中。- 此时消费者监听此死信队列并消费此消息。
死信队列有什么用呢?
- 取消订单(比如下单30分钟后未付款,则取消订单,回滚库存),或者新用户注册,隔段时间进行短信问候等。
- 将消费者拒绝的消息发送到死信队列,然后将消息进行持久化,后续可以做业务分析或者处理。
2. TTL
因为要实现延迟消息,我们先得知道如何设置过期时间。这里指演示
TTL
:Time To Live
(存活时间/过期时间),当消息到达存活时间后,还没有被消费,会被自动清除。
RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。
-
设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。
-
设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断这一消息是否过期。 例:现在有两条消息,第一条消息过期时间为30s,而第二条消息过期时间为15s,当过了15秒后,第二条消息不会立即过期,而是要等第一条消息被消费后,第二条消息被消费时,才会判断是否过期,所以当所有消息的过期时间一致时(比如30m后过期),最好给队列设置过期时间,而不是消息。但是有的情况确实每个消息的过期时间不一致,比如海底捞预约,每个人预约的时间段不一致,有个可能一个小时后,有的可能三个小时等,当快到预约时间点需要给用户进行短信通知,这就有问题了,不可能设置那么多的队列,这时就需要使用
延迟队列
来实现这个功能(下篇博文会讲到)。 -
如果两者都进行了设置,以时间短的为准。
2.1 队列设置TTL
2.1.1 引入所需依赖
2.1.2 application.yaml
2.1.3 RabbitConfig
- 声明一个过期时间为30s的
Queue
。 - 声明一个交换机(这里声明的是主题交换机,交换机类型无所谓,只要消息能路由到
Queue
即可)。 - 设置绑定关系。
2.1.4 Producer
2.1.5 测试代码
2.1.6 启动测试
运行测试代码后,到RabbitMQ 控制台中查看队列即消息情况。
如图所示,消息存活30s未被消费后,消息被遗弃。
2.2 消息设置TTL
2.2.1 Producer
我们将Producer代码稍加修改,给消息设置10s的过期时间,观察消息到底是存活30s还是10s。
2.2.2 启动测试
如图所示,消息只存活了10s。
我们将过期时间设置成40s后,但消息还是只存活了30s。说明当同时设置了过期时间时,是以时间短的为准。
3. TTL + DLX
接下来我们通过设置过期时间和死信队列来实现延迟队列
的功能。
首先罗列下实现步骤:
- 声明一个
Exchange
与TTl Queue
,并且绑定关系,实现生成死信的逻辑。 - 声明一个
DLX
与Queue
,此步骤的Queue
是为了接收死信并让Consumer
进行监听消费的。 - 将
TTl Queue
与DLX
进行绑定,使消息成为死信后能转发给DLX
。
3.1 RabbitConfig
其实DLX与普通的Exchange没有什么区别,只不过是“生产”死信的Queue
指定了消息成为死信后转发到DLX。
3.2 Producer
3.3 Consumer
3.4 测试代码
3.5 启动测试
输出日志内容如下:
__EOF__

本文链接:https://www.cnblogs.com/ludangxin/p/15291518.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏