记rabbitmq延迟队列的实现
By skyshappiness Posted 2020-11-17 19:00:21 In

一、背景

订单正常情况下面,长时间未支付,这时需要取消订单的一个锁定状态,并且回滚之前所定的库存;这时候除了使用redis的zset之外,还可以使用rabbitmq的延迟队列来实现。但是最好不要使用rabbitmq的 TTL+死信队列的形式去实现它,尽量使用 rabbitmq_delayed_message 插件来实现我们的需求。

TTL+死信队列存在着阻塞。假设第一条信息60秒过期,第二条信息30秒过期;理论上 consumer 应该先接收到第二条信息,但实际情况是 consumer 会优先接收到第一条60秒过期的数据,再接收到 第二条30秒过期的数据

二、环境搭建

docker run -d --name myRabbitMq -e RABBITMQ_DEFAULT_USER=xxx -e RABBITMQ_DEFAULT_PASS=xxx -p 15672:15672 -p 5672:5672 rabbitmq:3.8.14-management


curl -O 对应版本的插件下载地址 //github自己找


docker cp xxxx dockerName:docker中的路径(rabbitmq插件地址一般是:/plugins)


docker exec -it dockerName sh //进入docker容器


ls -la /plugins. //查看是否具有权限,没有的话可以用chown 修改下权限与权限分组, chmod 也可


rabbitmq-plugins enable rabbitmq_delayed_mesasge_exchange //启用插件





exit //退出docker


访问 rabbitmq 后台管理地址 查看exchange是否已经支持




三、参考代码



参考资料:

1、MQ延时队列的实现:https://www.jianshu.com/p/e5a42efb9198

2、rabbitMQ实现延时队列的两种方式:https://blog.csdn.net/java_zhulinghai/article/details/127064988

3、get插件地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

友情链接
联系方式
  • 邮箱 / E-mail:121388038@qq.com