我们知道,RabbitMQ是没有延时列队的,要实现延时列队需要用迂回的方式:
- 使用2个列队
- 给第一个列队设置一个ttl(Time-To-Live消息存活时间),且让列队不消费,等待这个ttl的时间后,列队消息死亡,进入死信exchange到死信列队
- 设置死信列队可以再次路由到其他队列中,进行消息,从而实现延时的功能
流程图如下:
这个方式有个问题就是流程有点复杂,
会产生很多列队和交换机(尤其是当业务较多,有较多类型的消息要实现延迟的情况下,会成倍的增加这些列队)容易出错。
延时插件解决方式
RabbitMQ是支持插件的,好在有专门的延迟插件来做这件事情,Github官网:rabbitmq-delayed-message-exchange
插件文件下载:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases下载到最新的插件文件,例如:rabbitmq_delayed_message_exchange-3.10.2.ez
- 非Docker方式安装的RabbitMQ启用方式
把rabbitmq_delayed_message_exchange-3.10.2.ez文件复制到rabbitMQ安装目录的plugins目录,例如:/opt/rabbitmq/plugins/下
然后执行启用插件命令:
# first cp rabbitmq_delayed_message_exchange-3.10.2.ez to: /opt/rabbitmq/plugins/ /opt/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_delayed_message_exchange # 启用好了以后,重启RabbitMQ即可
- Docker方式安装的RabbitMQ启用方式
如果是docker方式安装的,也很简单,假设rabbitmq_delayed_message_exchange-3.10.2.ez是在主机上加载好了,放在/opt/rabbitmq_delayed_message_exchange-3.10.2.ez
首先先把/opt/rabbitmq_delayed_message_exchange-3.10.2.ez复制到容器里去:
# 把rabbitmq_delayed_message_exchange-3.10.2.ez复制到容器里去(容器名称rabbitmq可以根据docker ps看下,或者使用容器ID) docker cp /opt/rabbitmq_delayed_message_exchange-3.10.2.ez rabbitmq:/opt/rabbitmq/plugins/ # 进入容器 docker exec -it rabbitmq bash # 进入容器后,直接启用plugin /opt/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_delayed_message_exchange # 退出容器后,重启下rabbitmq docker restart rabbitmq
然后网页上登录后,看看新建交换机里面的类型是否有x-deplayed-message这种交换机类型了。
上图:
文章评论