Docker环境下安装RabbitMQ延迟队列插件

一、超时取消

首先,我们先回想一些实际的业务场景:
1.电商平台上下单后,30min内如果不支付,订单将自动取消;
2.12306购买火车票,下单后15min内不支付,车票自动取消;在这里插入图片描述
这些是怎么实现的呢?很显然最简单的就是通过定时器实现,创建一个定时器,每分钟都去扫描下订单表,判断处于未支付状态订单创建时间与当前时间的差值是否≥30分钟了,如果是则执行取消订单业务逻辑。
定时器的实现方式,简单粗暴,在数据量很小的情况下还勉强可以使用,但是当订单表数据量越来越大时,定时器每次执行都要去扫描下百万级,千万级体量的数据表,这是绝对不允许的做法。

二、延迟队列

某位不知名的人曾说道: “既然门被堵死了,那我们就看看能不能翻窗户过去”。
我们再仔细琢磨下上面的业务场景,它们业务需求上有个核心的特点——延迟
即延迟一段时间后做某件事情。这时候RabbitMQ就登场了。
RabbitMQ是款主流的消息中间件,借助它我们实现延迟队列,轻松实现上面的需求。关于RabbitMQ的特性和基本用法本文不做赘述。感兴趣的可以自行搜索下。

1.什么是延迟队列?

无论RabbitMQ、kafka还是其它消息中间件,当消息被正确的投递的队列后,监听这个队列的消费者会立即取出消息进行消费。如果消息被投递到队列后,可以延迟一段时间后才被消费,那么这就是延迟队列。并且延迟时间是可以自定义法的。

2.如何使用延迟队列?

上面说过,在延迟队列中,消息被投递到队列后,可以延迟一段时间后才被消费。那么我们就可以在创建订单时向MQ中投递一个消息,消息内容为订单ID,并指定消息延迟时间为30分钟,这样就可以达到与定时器一样的效果,并且更加优雅、高效。

三、RabbitMQ延迟队列插件

在RabbitMQ中,我们可以通过消息的过期时间TTL和死信队列DLX来实现延迟队列,虽说这种实现的方式可以用,但是并不推荐,因为比较复杂,还有许多问题。
RabbitMQ官方提供了延迟队列插件rabbitmq-delayed-message-exchange,使我们的使用延迟队列更加简单。接下来我们就来动手安装下:

1.下载插件

我们需要去RabbitMQ官网上下载延迟队列插件,插件链接link,下载前请确认自己的RabbitMQ版本,下载对应版本的插件。
在这里插入图片描述点击Download for 3.7.x / 3.8.x后默认会跳转到Github,然后我们选择图中ez格式文件
在这里插入图片描述

2.将插件上传到docker容器内部

①首先我们将刚下载下来的rabbitmq_delayed_message_exchange-3.8.0.ez文件上传到RabbitMQ所在服务器,此处我上传到了服务器/mnt目下
在这里插入图片描述②然后我们使用docker ps命令找到运行中的RabbitMQ容器
在这里插入图片描述③执行docker exec -it 3a /bin/bash命令进入到容器内部,3a是RabbitMQ容器ID,注意替换你自己的,然后我们可以看到plugins目录
在这里插入图片描述④执行docker cp /mnt/rabbitmq_delayed_message_exchange-3.8.0.ez 3a:/plugins命令,将刚插件拷贝到容器内plugins目录下
在这里插入图片描述
⑤在容器内plugins目录下,查看插件是否上传成功ls -l|grep delay
在这里插入图片描述

3.启用插件

同样是在容器内plugins目录下,执行rabbitmq-plugins enable rabbitmq_delayed_message_exchange,启用插件,如下图
在这里插入图片描述到这里插件安装就完成了,接下来我们需要重启RabbitMQ容器。执行exit命令退出RabbitMQ容器内部,然后执行docker restart 3a命令重启RabbitMQ容器
在这里插入图片描述

4.登录RabbitMQ的Web端管理界面

在容器重启完成后,我们可以登录RabbitMQ的Web端管理界面,在Exchanges选项卡下,点击Add a new exchange,在Type里面看是否出现了x-delayed-message选项,如下图到这里,整个安装过程就完毕了。
在这里插入图片描述

三、写在最后

如果你还不清楚docker下如何安装RabbitMQ,可以看我相关博文docker安装RabbitMQ.
由于篇幅限制,在下篇文章为大家带来延迟队列的实际开发应用代码——SpringBoot与RabbitMQ集成—延迟队列实战

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐