• 前端
  • JS
  • CSS
  • HTML
  • Mysql
  • Linux
  • SVN
  • 环境uedbet官网手机版最新
  • uedbet西甲体育投注详解
  • MAC_BOOK
  • 算法
  • 记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