• RabbitMQ中延迟队列的全方位解析


    前言

    工作中有些场景需要用到延迟队列,大概对RabbitMQ延迟队列场景有一些了解,网上大部分的场景应用于:订单超时、定时执行等。

    而我需要延迟队列的场景是:有一批机器需要监控这个延迟队列长度,一旦满足就提前预备机器,准备执行任务。通过监控延迟队列,我可以准确、可靠的清楚,接下来的某个时间我一定会执行哪些任务。相较于传统通过API来唤醒设备,提升了稳定性。我只需要关注一点:发布消息。

    同时也了解到,大部分使用RabbitMQ实现延迟队列从两个方向入手:

    • 死信队列+TTL
    • 延迟队列插件

    接下来,我将会从这两个方向逐一进行,分析利弊。

    阅读本文,你将获得:

    1. 死信队列的场景化使用
    2. 队列TTL及消息TTL出现的各种问题解决
    3. RabbitMQ在docker下插件安装
    4. 完整的Python实现源代码

    死信队列

    通过死信队列来解决延迟队列给人的感觉是「曲线救国」的方案,因为在原生RabbitMQ中并不直接支持延迟队列。其原理就是把消息发给一个中间队列,这个中间队列预设了TTL过期时间,并绑定了死信队列和死信交换机,当中间队列的消息过期时,就会发送到死信队列中。届时,死信队列就充当了延迟队列。

     

    Python代码如下:

    1. # -*- coding: utf-8 -*-
    2. from mq import channel
    3. DEAD_EXCHANGE_NAME = 'dead.exchange'
    4. DEAD_QUEUE_NAME = 'dead.queue'
    5. DEAD_ROUTING_KEY = 'dead.routing.key'
    6. QUEUE_NAME = 'normal.queue'
    7. # 声明死信交换机
    8. channel.exchange.declare(DEAD_EXCHANGE_NAME, exchange_type="direct")
    9. # 声明死信队列
    10. channel.queue.declare(DEAD_QUEUE_NAME, durable=True)
    11. # 死信队列绑定死信交换机和死信路由
    12. channel.queue.bind(
    13. queue=DEAD_QUEUE_NAME,
    14. exchange=DEAD_EXCHANGE_NAME,
    15. routing_key=DEAD_ROUTING_KEY,
    16. )
    17. # 声明正常队列,并绑定死信交换机和死信路由,约束队列TTL为10
    18. arguments = {
    19. "x-dead-letter-exchange": DEAD_EXCHANGE_NAME,
    20. "x-dead-letter-routing-key": DEAD_ROUTING_KEY,
    21. "x-message-ttl
  • 相关阅读:
    java计算机毕业设计学生健康信息管理源码+系统+mysql数据库+lw文档
    【六袆 - MySQL】SQL优化;Explain SQL执行计划分析;
    Layui快速入门之第三节栅格布局
    Koa 快速入门
    商家收款一万手续费多少
    网络安全(黑客)自学
    spark(day05)
    redis主从+哨兵+集群模式搭建详解
    深入理解 python 虚拟机:GIL 源码分析——天使还是魔鬼?
    【数据分析】基于Matlab检测多元数据集中的异常值
  • 原文地址:https://blog.csdn.net/lt_xiaodou/article/details/126604076