RabbitMQ中三个TTL的探讨

RabbitMQ 中存在三个TTL,简单探讨一下,这或许对你实现一个高可用的消息队列有帮助。

TTL各自含义

在实现延迟队列的生产者代码中,一共出现了三个TTL,这三个TTL值得探讨一下,这或许对你实现一个高可用的消息队列有帮助。

  • x-message-ttl 在创建队列时设置的消息TTL,表示消息在队列中最多能存活多久(ms);
  • Expiration 发布消息时设置的消息TTL,消息自产生后的存活时间(ms);
  • x-delayrabbitmq_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-ttlExpiration,如果不设置表示永不过期;设置 0,需要有消费者立即消费,否则将会被丢弃。