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是惰性检查
eg1.
eg2.
标签:设置,队列,RabbitMQ,死信,消息,延时,TTL,路由 From: https://blog.51cto.com/u_15905340/5919703