富连网网站开发,网站被k怎么,seo学徒,网站右侧虚代码之前在写Spring Cloud Stream专题内容的时候#xff0c;特地介绍了一下如何使用RabbitMQ的延迟消息来实现定时任务。最近正好因为开发碰到了使用过程中发现#xff0c;延迟消息没有效果#xff0c;消息直接就被消费了的情况。因此就继续深入研究了一下问题原因#xff0c;在…之前在写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?messagehellodelay5000请求2延迟1年31536000000毫秒。消息发送到MQ之后马上就被消费者消费了完全没有延迟效果。
curl localhost:8080/sendMessage?messagehellodelay31536000000问题小结
在明确了问题原因之后需要对该功能的时候做一些明确的限定延迟时间的极限以避免再次出现类似的问题。深入探索下去这里的失败主要与消息的过期时间TTL有直接的关系。在RabbitMQ中消息的过期时间必须是非负 32 位整数即0 n 2^32-1以毫秒为单位。 其中2^32-1 4294967295。
这里我们可以尝试下面两个请求分别设置延迟时间为4294967295何4294967296
curl localhost:8080/sendMessage?messagehellodelay4294967295curl localhost:8080/sendMessage?messagehellodelay4294967296可以发现当延迟时间为4294967295毫秒的时候延迟消息工作正常当延迟时间为4294967296毫秒的时候消息被直接消费没有延迟效果。
所以我们在使用RabbitMQ的延迟消息功能时候必须注意它的延迟极限是4294967295毫秒。如果你的业务需求会超过这个临界值就必须避开这个坑采用其他方法来实现需要延迟或者定时执行的任务了。
代码示例
本文示例读者可以通过查看下面仓库的中的stream-delayed-message项目
Github: https://github.com/dyc87112/SpringCloud-Learning/tree/master/4-FinchleyGitee: https://gitee.com/didispace/SpringCloud-Learning/tree/master/4-Finchley
如果您对这些感兴趣欢迎star、follow、收藏、转发给予支持