一. TTL 过期时间
- 消息TTL
ttl与网络包跳数超时原理一致, 消息在队列中生存的时间超过ttl,就会成为"死信" 消费者无法再接收处理该消息, 除非放入死信队列等进行转移处理
ttl设置方法:
-
设置队列属性, 那么队列中所有的消息都有相同的超时时间
设置方法为在queue declare声明定义的世行加入x-message-ttl进行设置 , 单位是毫秒
-
消息本身进行设置, 消息的超时时间不一样
(两个一起使用时,以ttl最小的那个为准)
设置方法, 在basicpublish的时候,设置expiration属性参数, 单位也为毫秒
队列属性设置ttl, 如果消息过期,则会直接从对列中丢弃,原因是,由于ttl一致, 又基本是FIFO的模式,那么过期消息一定在队列的头部。
对于消息本身设置ttl, 消息过期,不会马上丢弃,而是在消息进行投递的时候检查过期再丢弃, 这样1. 简单,维护成本低 2. 性能更好,不用实时扫描队列
不设置ttl, 则消息不会过期, 如果ttl为0, 除非消息直接投递给消费者,否则直接丢弃,这个就可以模拟之前的immediate消息处理, 但是immediate 会return消息给生产者,ttl直接丢弃,这里是区别
注: 如果rabbitmq在投递消息的时候发现消息队列为空,那么将会尝试将消息直接投递给消费者,而不用再进入消息队列进行处理