rabbitmq实现延时消息主要有两种方式:
简述:使用两个队列,一个队列接收消息不消费,等待指定时间后消息死亡,再由该队列绑定的死信exchange再次将其路由到另一个队列提供业务消费。
先贴两个个rabbitmq官方文档:
我这里也简单介绍下:
rabbitmq 可以给 消息 和 队列 设置 ttl(生存时间)
x-message-ttl=60000
(队列中所有消息都只有60s存活时间)expire=60000
指定消息只有60s存活时间如果队列和消息同时设置了ttl,则取较小的那个作为ttl。消息死亡后不会被消费者消费。
死信(死亡的消息):
basic.reject
或 basic.nack
并将requeue
参数设置为 false 来否定的消息当一个队列设置了死信exchange 后,这个队列的死信都会被投递到死信exchange中,然后可以再次路由到其他队列中(如果指定了死信routing key 则死信消息routing key 变为设置的routing key,未设置则为原始 routing key)。
一个消息的流程大概是:
具体使用推荐另一篇文章:
RabbitMQ 实现固定延时等级的延时消息, 直接实现一套不同延时等级的消息,就不用每次都配置各种exchange和queue绑定关系了。
缺点:
优点:
适用场景: 使用固定延迟时间的场景。
备注:对于高版本(3.6及以上)的rabbitmq建议使用lazy-mode作为延迟队列,防止大量延时消息堆积而占用大量内存,从而触发rabbitmq换页阻塞队列。 (如果使用spring的话,即使低版本rabbitmq也不用太担心:spring-amqp默认发送持久化消息,即使触发换页,也只是把消息从内存中逐出而已。)
简述:延时消息不直接投递到队列中,而是先转储到本地Mnesia数据库中,然后定时器在消息到期后再将其投递到队列中。
关于用法可以直接看这个文档或者网上搜一搜,这里就不介绍了。
github地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
其大概原理就是:指定了延时的消息,会被先保存在 Mnesia (erlang编写的数据库管理系统)中,然后有一个定时器去查询最近需要被投递的消息,将其投递到目标队列中。
优点:
缺点:
issues#72
适用场景::如果不是无关紧要的小业务,不建议使用。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦