赞
踩
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
适用场景::如果不是无关紧要的小业务,不建议使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。