RabbitMQ中三个TTL的探讨
RabbitMQ 中存在三个TTL,简单探讨一下,这或许对你实现一个高可用的消息队列有帮助。
TTL各自含义
在实现延迟队列的生产者代码中,一共出现了三个TTL,这三个TTL值得探讨一下,这或许对你实现一个高可用的消息队列有帮助。
x-message-ttl
在创建队列时设置的消息TTL,表示消息在队列中最多能存活多久(ms);Expiration
发布消息时设置的消息TTL,消息自产生后的存活时间(ms);x-delay
由rabbitmq_delayed_message_exchange
插件提供TTL,从交换机延迟投递到队列的时间(ms);
用例
消息积压在本文中指当前消息前面还有其他消息。
用例一
x-message-ttl = 60000
Expiration = 20000
x-delay = 0
x-delay = 0 表示无rabbitmq_delayed_message_exchange
插件干扰下。
在消息无积压的情况下,当前消息将在 20s 后过期并被丢弃(丢弃指没设置死信队列情况下,下文同)。
在消息积压的情况下,若时间在 20s~60s 之间,虽然已经超过了 Expiration 设置的TTL,但当前消息是不会被丢弃的。因为 RabbitMQ 仅判断队列中第一个消息是否过期,选择消费还是丢弃。
在消息积压的情况下,若时间在大于 60s,已经 x-message-ttl 设置的 TTL,消息会被丢弃。x-message-ttl 表示一个消息在本队列中最多能存活多久。
用例二
x-message-ttl = 60000
Expiration = 20000
x-delay = 10000
在消息无积压的情况下,当前消息将在 20s 后过期被丢弃。当前消息的生命周期将是产生后进入交换机,等待 10s 后投递到队列,20s 后过期丢弃。
在消息积压的情况下,当前消息将在 20s 后过期后不一定会被丢弃。直到消息不积压,RabbitMQ 判断它已过期将其丢弃。
在消息积压的情况下,当前消息将在 10+60s 后一定会被丢弃。队列不让消息“待了”。
用例三
x-message-ttl = 5000
Expiration = 20000
x-delay = 10000
无论消息是否积压,当前消息将在 10+5s 后一定被丢弃。当前消息的生命周期将是产生后进入交换机,等待 10s 后投递到队列,进入队列 5s 后,队列不让消息“待了”,消息被丢弃。尽管 Expiration 设置的TTL还未到,队列就是如此“霸道”。
此外
x-message-ttl
和Expiration
,如果不设置表示永不过期;设置 0,需要有消费者立即消费,否则将会被丢弃。