关于golang:RabbitMQ中三个TTL的探讨

87次阅读

共计 1016 个字符,预计需要花费 3 分钟才能阅读完成。

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,须要有消费者立刻生产,否则将会被抛弃。

正文完
 0