摘要:问题定位因为不是所有的消息都出现了没有延迟消息效果的因素,通过有问题的消息特征,大致猜测可能是延迟时间过长导致了消息延迟失败。所以,我们在使用的延迟消息功能时候,必须注意它的延迟极限是毫秒。
之前在写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=4294967295 curl localhost:8080/sendMessage?message=hello&delay=4294967296
可以发现,当延迟时间为4294967295毫秒的时候,延迟消息工作正常;当延迟时间为4294967296毫秒的时候,消息被直接消费,没有延迟效果。
所以,我们在使用RabbitMQ的延迟消息功能时候,必须注意它的延迟极限是4294967295毫秒。如果你的业务需求会超过这个临界值,就必须避开这个坑,采用其他方法来实现需要延迟或者定时执行的任务了。
代码示例本文示例读者可以通过查看下面仓库的中的stream-delayed-message项目:
Github: https://github.com/dyc87112/S...
Gitee: https://gitee.com/didispace/S...
如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!
欢迎关注我的公众号:程序猿DD,获得独家整理的学习资源和日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:didispace.com
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75551.html
摘要:然而实际业务中还存在另外一种定时任务,它可能需要一些触发条件才开始定时,比如编写博文时候,设置小时之后发送。在消息监听类中,对通道定义了,这里会对延迟消息做具体的逻辑。由于消息的消费是延迟的,从而变相实现了从消息发送那一刻起开始的定时任务。 应用场景 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者...
摘要:官方插件仅支持版本中支持。使用过程声明消息交换机实现实现消息发送实现实现 官方插件仅支持>=3.6.x 版本中支持。 本文描述的消息延迟机制采用官方推荐的插件rabbitmq-delayed-message-exchange,如精通rabbitmq和编程,请自行查看官方文档,描述更加详尽: github Rabbitmq插件列表 安装 需要在集群每台机器中安装由于rabbitmq并...
摘要:另一种就是用中的位于包下,本质是由和实现的阻塞优先级队列。表明了一条消息可在队列中存活的最大时间。当某条消息被设置了或者当某条消息进入了设置了的队列时,这条消息会在时间后死亡成为。 SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可...
摘要:基础组件架构设计基础组件封装设计迅速消息发送支持迅速消息发送模式,在一些日志收集统计分析等需求下可以保证高性能,高吞吐量。基础组件封装设计事务消息发送支持事务消息,且保障可靠性投递,在金融行业单笔大金额操作时会有此类需求。 Rabbitmq基础组件架构设计 基础组件封装设计 - 迅速消息发送支持迅速消息发送模式,在一些日志收集、统计分析等需求下可以保证高性能,高吞吐量。 基础组件封...
阅读 3123·2023-04-25 17:19
阅读 574·2021-11-23 09:51
阅读 1314·2021-11-08 13:19
阅读 744·2021-09-29 09:34
阅读 1588·2021-09-28 09:36
阅读 1437·2021-09-22 14:59
阅读 2661·2019-08-29 16:38
阅读 2004·2019-08-26 13:40