0
点赞
收藏
分享

微信扫一扫

RabbitMQ 实现延时队列


1. 消息的TTL(Time To Live)


消息的 TTL 就是 消息的存活时间 。


RabbitMQ 可以对 队列 和 消息 分别设置 TTL 。


对队列设置就是队列没有消费者连着的保留时间, 也可以对每一个单独的消息做单独的 设置。超过了这个时间,我们认为这个消息就死了,称之为死信 。


如果队列设置了,消息也设置了,那么会 取小的 。所以一个消息如果被路由到不同的队 列中,这个消息死亡的时间有可能不一样(不同的队列设置)。这里单讲单个消息的


TTL,因为它才是实现延迟任务的关键。可以通过设置消息的expiration字段或者x-  message-ttl属性来设置时间,两者是一样的效果。

2. Dead Letter Exchanges(DLX)


一个消息在满足如下条件下,会进 死信路由 ,记住这里是路由而不是队列, 一个路由可以对应很多队列。(什么是死信)


一个消息被 Consumer 拒收了,并且 reject 方法的参数里 requeue 是 false 。也就是说不 会被再次放在队列里,被其他消费者使用 。 basic.reject/ basic.nack requeue=false


上面的消息的 TTL 到了,消息过期了。


队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上


Dead Letter Exchange 其实就是一种普通的 exchange , 和创建其他


exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有 消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。


我们既可以控制消息在一段时间后变成死信,又可以控制变成死信的消息 被路由到某一个指定的交换机,结合二者,其实就可以实现一个延时队列




3.延时队列实现:

    推荐:




RabbitMQ 实现延时队列_字段


不推荐:因为RabbitMQ是惰性检查



RabbitMQ 实现延时队列_rabbitmq_02


eg1.

RabbitMQ 实现延时队列_rabbitmq_03

eg2.

RabbitMQ 实现延时队列_分布式_04

举报

相关推荐

0 条评论