RabbitMQ-延迟队列
1. 简介
我们在上一篇博文中遗留了一个小问题,就是虽然TTL + DLX
能实现延迟队列的功能,但是有两个问题。
首先业务场景为:比如海底捞预约,每个人预约的时间段不一致,有个可能一个小时后,有的可能三个小时等,当快到预约时间点需要给用户进行短信通知。
- 通过给
Queue
设置过期时间的方式不现实,因为很有可能每条记录的过期时间都不一样,不可能设置那么多的Queue
。 - 直接给
Message
设置过期时间,这种方式也不好,因为这种方式是当该消息在队列头部时(消费时),才会单独判断这一消息是否过期。例:现在有两条消息,第一条消息过期时间为30s,而第二条消息过期时间为15s,当过了15秒后,第二条消息不会立即过期,而是要等第一条消息被消费后,第二条消息被消费时,才会判断是否过期,也就是等到第二条消息投往DLX
已经过去45s了。
这也就抛出了本章主题:延迟队列
。
RabbitMQ默认没有提供延迟队列
功能,而是要通过插件提供的x-delayed-message
(延迟交换机)来实现。
延迟队列
:用户可以使用该类型声明一个交换,x-delayed-message
然后使用自定义标头发布消息,x-delay
以毫秒为单位表示消息的延迟时间。消息将在x-delay
毫秒后传递到相应的队列。
2. 安装插件
官方插件地址:https://www.rabbitmq.com/community-plugins.html
找到插件rabbitmq_delayed_message_exchange
,进入GitHub下载本地RabbitMQ对应的插件版本(下载.ez
文件)。
下载到本地后将文件放置RabbitMQ的plugins目录。
我这里本地是使用docker-compose安装的服务,image
为rabbitmq:3.8.3-management
(虽然版本没对起来,但是测试能用,但是使用3.9的版本会报错,插件安装失败)安装的服务,操作步骤如下:
-
将下载好的文件放置RabbitMQ插件目录
rabbitmq:容器服务名
-
进入容器
-
查看现有的插件列表
-
启用插件
-
再次查看安装列表就有了
rabbitmq_delayed_message_exchange
安装完毕后登陆RabbitMQ控制台查看,会发现多了个x-delayed-message
类型的Exchange。
3. 实现延迟队列
3.1 引入所需依赖
3.2 application.yaml
3.3 RabbitConfig
3.4 Producer
3.5 Consumer
3.6 测试代码
3.7 启动测试
启动测试代码,连续发送7条消息输出内容如下:
从日志内容可以看出,虽然我们先发送了16s的那条消息,但最终消息的过期顺序还是按照10-16s的顺序,符合预期。
__EOF__

本文链接:https://www.cnblogs.com/ludangxin/p/15302794.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示