RabbitMQ的任意延迟队列

前言:原博主写的有点乱,但还是能学到点东西的。

  • 普通的延迟队列不细说了,无论是设置统一的队列TTL,还是设置消息的TTL,全都是利用DeadLetterQueue:消息失效后扔到死信队列,消费者从死信队列里读消息。但在消息失效的过程中存在一个问题,比如如下场景:
延迟队列中依次收到如下消息
Message A: TTL 2000
Message B: TTL 100
Message C: TTL 5000当延迟队列中消息超时后,移至死信队列
  • 实际执行情况是rabbitMQ从队列头取到消息A,等待2秒,超时,发至死信队列 -> 判断消息B,发现已经超时,立即发至死信队列。原因是TTL被存在消息的内部,rabbitMQ一直去扫描每条消息的TTL,而是只判断队列头消息是否失效,于是消息B实际失效时间是2000ms。
  • 目前rabbitMQ是不支持任意超时时间的(据说rocketMQ提供有限支持,没用过),但可以通过安装一个插件来解决:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

  • 安装过程很简单,下载下来,在rabbitMQ的sbin目录下执行安装
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
  • 插件使用Exchange交换机来实现的TTL,而不是rabbitMQ那样通过死信队列:首先设置一个可延迟的Exchange,该Exchange会将收到的消息存放,按照延迟时间排序,直到达到延迟,才被转发到实际的执行队列。
  • 启用插件后,进入rabbitMQ的管理页面进行配置:

  • 新建一个Exchange,Type必须选择x-delayed-message,添加参数x-delayed-type=direct,然后绑定到执行队列
$msg = new AMQPMessage(json_encode(['event' => $eventName,'params' => $params]), ['delivery_mode' => 2,]);$headers = new AMQPTable(['x-delay' => $delay]);$msg->set('application_headers', $headers);$this->channel->basic_publish($msg, self::EXCHANGE_DELAY_ANY_NAME, self::EXCHANGE_KEY_NOW);
  • 接下来,为投递到该Exchange的消息添加插件所需的header:x-delay,值就是要延迟的时间,单位毫秒,如果不添加这个头,所有流入该交换机的消息都会立即被转发到执行队列。注意如果使用php-amqplib的话,需要用AMQPTable设置这个header
  • 接下来按照刚才的三条消息测试一下,发现B消息成功比A消息进入队列了。搞定

RabbitMQ的任意延迟队列相关推荐

  1. RabbitMQ如何实现延迟队列?

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. SpringBoot RabbitMQ 集成 七 延迟队列

    为什么80%的码农都做不了架构师?>>>    何为延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列.而一般的队列,消息一旦入队了之后就会被消费者马上消费. 延迟 ...

  3. RabbitMQ如何实现延迟队列

    1.延迟队列 延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费.很可惜,在RabbitMQ中并未提供延迟队列功能,但是我们有其他的方式可以实现延迟队列,方法就是TTL+死信队列 ...

  4. 【RabbitMQ】一文带你搞定RabbitMQ延迟队列

    本文口味:鱼香肉丝   预计阅读:10分钟 0|1一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经 ...

  5. rabbitMq实现延迟队列

    文章目录 业务场景: 1 安装rabbitMq 2 添加maven依赖 3 在application.properties配置 4 具体的实现 4.1 Dead Letter Exchanges 4. ...

  6. Rabbitmq超级详细的笔记,包括安装,基本命令,rabbitmq的七种消息模式,以及死信队列,延迟队列,优先级队列和惰性队列的介绍

    RabbitMQ 文章目录 RabbitMQ 1 RabbitMQ介绍 1.1 基本介绍 1.2 RabbitMQ的安装 1.2.1 ubuntu20.04 安装rabbitmq 1.2.2 cent ...

  7. 面试官:RabbitMQ本身不支持延迟队列,那你给我实现一个?

    以下文章来源方志朋的博客,回复"666"获面试宝典 RabbitMQ本身没有延迟队列的支持,但是基于其本身的一些特性,可以做到类似延迟队列的效果:基于死信交换器+TTL. 以下介绍 ...

  8. rabbitmq延迟队列实现

    延迟队列 Rabbitmq并没有延迟队列 但是:死信队列+消息时间设置过期时间可以 达成我们想要的延迟队列效果 例如下单5分钟之内未支付就会取消订单,那么设置下单支付时间为5分钟后过期然后进入死信队列 ...

  9. RabbitMq(五) -- 死信队列和延迟队列

    1. 死信 1.1 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue ...

  10. RabbitMQ 延迟队列详解

    一.延迟队列概念 延迟队列存储的对象是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费. 二.延 ...

最新文章

  1. post请求中的序列化
  2. Electrification Plan
  3. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
  4. matlab欧拉法程序,欧拉法matlab程序.doc
  5. 【例题+习题】【数值计算方法复习】【湘潭大学】(六)
  6. Android笔记 采用async http 框架 提交数据到服务器demo
  7. date日期 和 date时间拼接_函数周期表丨时间丨值丨DATE
  8. ORACLE 中IN和EXISTS比较
  9. 什么是推荐系统以及应用场景
  10. 1.封包(二)(雷电模拟器+ProxyDroid+CCProxy+WPE) 的使用
  11. 盗火:硅谷、海豹突击队和疯狂科学家如何变革我们的工作和生活
  12. quartz 表结构 oracle,Quartz所使用的表的说明
  13. 【英语四六级-必背单词】高中英语单词 (G)-MP3试听与下载
  14. 方正飞鸿智能信息平台产品白皮书(三)
  15. 基于微信小程序的todo番茄钟设计与实现源码
  16. 罗塞塔石碑(Rosetta Stone)安装指南
  17. linux 如何安装maven
  18. 590. N-ary Tree Postorder Traversal*
  19. 网卡(eth、lo)
  20. ESP32-Camera性能(简单)测试评估

热门文章

  1. 概率论在实际生活的例子_「收藏」不确定度是什么?两个例子让你清清楚楚
  2. java开发项目经验_十年开发经验总结的 Java 程序员架构学习路线
  3. python和web前端哪个容易_Python和Web前端选择哪个比较合适?
  4. 题目241-字母统计
  5. es 全量同步mysql_MySQL用得好好的,为什么要转ES?
  6. keil5安装_如何安装Keil5
  7. android tab 选中变色,Android 底部导航栏的Tab选中不变色?
  8. 双系统linux安装cetos,电脑安装windows和centOS系统双系统
  9. android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
  10. linux 动态链接库 函数共享,LINUX动态链接库高级应用(etc/ld.so.conf)共享动态链接库...