RabbitMQ中三個TTL的探討

Mr-houzi發表於2022-02-09

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,需要有消費者立即消費,否則將會被丟棄。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章