之前在写Spring Cloud Stream专题内容的时候,特地介绍了一下如何使用RabbitMQ的延迟消息来实现定时任务。最近正好因为开发碰到了使用过程中发现,延迟消息没有效果,消息直接就被消费了的情况。因此就继续深入研究了一下问题原因,在此记录下来,给碰到类似问题的童鞋们参考。

问题定位

因为不是所有的消息都出现了没有延迟消息效果的因素,通过有问题的消息特征,大致猜测可能是延迟时间过长导致了消息延迟失败。为了验证这个原因,先拿之前文章中的例子,来测试一下延迟时间是否与问题直接相关。

对之前的延迟消息使用样例(文末的Git仓库中可以获取完整代码)接口做一下微改,增加了一个请求参数delay来控制延迟时间:

@GetMapping("/sendMessage")public String messageWithMQ(@RequestParam String message, @RequestParam Long delay) {    log.info("Send: " + message);    testTopic.output().send(MessageBuilder.withPayload(message).setHeader("x-delay", delay).build());    return "ok";}

然后尝试发起了两个请求:

请求1:延迟5000毫秒。消息发送到MQ之后确实延迟了5秒之后才得到了消费,没有任何问题。

curl localhost:8080/sendMessage?message=hello&delay=5000

请求2:延迟1年(31536000000毫秒)。消息发送到MQ之后马上就被消费者消费了,完全没有延迟效果。

curl localhost:8080/sendMessage?message=hello&delay=31536000000

问题小结

在明确了问题原因之后,需要对该功能的时候做一些明确的限定(延迟时间的极限),以避免再次出现类似的问题。深入探索下去,这里的失败主要与消息的过期时间(TTL)有直接的关系。在RabbitMQ中,消息的过期时间必须是非负 32 位整数,即:0 <= n <= 2^32-1,以毫秒为单位。 其中,2^32-1 = 4294967295。

这里我们可以尝试下面两个请求,分别设置延迟时间为4294967295何4294967296:

curl localhost:8080/sendMessage?message=hello&delay=4294967295curl localhost:8080/sendMessage?message=hello&delay=4294967296

可以发现,当延迟时间为4294967295毫秒的时候,延迟消息工作正常;当延迟时间为4294967296毫秒的时候,消息被直接消费,没有延迟效果。

所以,我们在使用RabbitMQ的延迟消息功能时候,必须注意它的延迟极限是4294967295毫秒。如果你的业务需求会超过这个临界值,就必须避开这个坑,采用其他方法来实现需要延迟或者定时执行的任务了。

代码示例

本文示例读者可以通过查看下面仓库的中的stream-delayed-message项目:

  • Github: https://github.com/dyc87112/SpringCloud-Learning/tree/master/4-Finchley
  • Gitee: https://gitee.com/didispace/SpringCloud-Learning/tree/master/4-Finchley

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!


RabbitMQ延迟消息的极限是多少?相关推荐

  1. RabbitMQ 延迟消息的极限是多少?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 之前在写Spring Cloud Stream专题内容的时候,特地介绍了一下如何使用Rabb ...

  2. RabbitMQ延迟消息场景分析以及实现两种方式(SpringBoot)

    使用场景,不限于下面 用户下订单结束,如果用户未及时支付,后续需要取消订单,可以怎么做?定时任务可以做,但是不能接近实时或者消耗数据库性能太大. [数据库定时任务方案]:定时任务可以做到订单的状态的改 ...

  3. spring boot 自学笔记(八) Rabbitmq 延迟消息(插件)

    在前面文章有通过Rabbit的死信方式来实现延迟队列机制, 但是这种方式有极大的弊端, 机试不考虑死信队列性能问题,另外发送的消息并不能保证时间延迟的可靠性,. 举例如下: 同时发送两条延迟消息,分别 ...

  4. Rabbitmq延迟消息队列服务启动报错

    报错 报错信息如下: Caused by: java.io.IOException: nullat com.rabbitmq.client.impl.AMQChannel.wrap(AMQChanne ...

  5. RabbitMQ延迟消息:死信队列 | 延迟插件 | 二合一用法+踩坑手记+最佳使用心得

  6. Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)

    应用场景 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天凌晨一点执行一次.然而实际业务中还存在另外一种定时 ...

  7. rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列

    延迟队列是为了存放那些延迟执行的消息,待消息过期之后消费端从队列里拿出来执行. DLX + TTL 方式存在的时序问题 对于延迟队列不管是 AMQP 协议或者 RabbitMQ 本身是不支持的,之前有 ...

  8. Delayed Message 插件实现 RabbitMQ 延迟队列

    延迟队列是为了存放那些延迟执行的消息,待消息过期之后消费端从队列里拿出来执行. DLX + TTL 方式存在的时序问题 对于延迟队列不管是 AMQP 协议或者 RabbitMQ 本身是不支持的,之前有 ...

  9. RabbitMQ(九):RabbitMQ 延迟队列,消息延迟推送(Spring boot 版)

    应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持 ...

最新文章

  1. [BI基础] ( 商务智能 ) 简介
  2. 九、BDB OneToMany
  3. 只有房子没有工作能贷款吗?
  4. python rowcount_PyQt(Python+Qt)学习随笔:QTableWidget的currentItem、rowCount、columnCount等部件状态属性访问方法...
  5. 分页缓冲池占用很高怎么解决_一次线上服务高 CPU 占用优化实践
  6. (87)FPGA读文件激励(readmemb)
  7. c语言录像带课程设计,2019信息技术真题共16页word资料
  8. 配置centos防火墙(iptables)开放80端口
  9. Failed to connect to GitHub to update the CocoaPods/Specs specs repo 问题
  10. 回顾2006年:网络通信十大事件
  11. ViewFlipper使用详解
  12. Ubuntu安装FreeSWITCH亲测
  13. golang语言环境搭建
  14. CAJ转换有免费的工具吗?
  15. 安全基础--21--安全运维
  16. Maya粒子特效制作(一)
  17. 笔记本(无线网卡)配置虚拟机上网
  18. 实现京东商城地址选择效果(效果还挺一致的)
  19. 新浪微博批量取消关注
  20. POSIX 标准介绍

热门文章

  1. C++11 bind注意事项(传引用参数的时候)
  2. 9个提高代码运行效率的小技巧你知道几个?
  3. vmware与windows共享文件夹
  4. 数据库实操——pandas写入数据库数据
  5. 奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案
  6. net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性
  7. Flink-Java版单词计数(批处理流处理)
  8. 如何阅读一本书 pdf_《如何阅读一本书》:一本书,四个层次,看阅读小白如何逆袭?...
  9. LeetCode MySQL 1853. 转换日期格式(日期格式化)
  10. LeetCode 1653. 使字符串平衡的最少删除次数(DP)