docker下安装RabbitMQ延迟队列插件
Docker环境下安装RabbitMQ延迟队列插件
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集成—延迟队列实战
更多推荐
所有评论(0)