天天看點

RabbitMQ實戰指南之Time-To-Live and Expiration

1 概述

RabbitMQ允許你為messages和queues設定TTL(存活時間)。這可以使用可選的queue 參數或政策來完成(建議使用後一個選項)。

Message TTL可以應用于單個隊列,一組隊列或逐個消息地應用。

TTL設定也可以由操作政策強制執行。

隊列中的 Per-Queue消息TTL

Message TTL可以通過使用政策設定

message-ttl

參數或通過在隊列聲明時指定相同的參數來為給定隊列設定.

已在隊列中的時間超過配置的TTL的消息被判定已死.

路由到多個隊列的消息可能會在其所在的每個隊列中的不同時間或根本不會消亡,一個隊列中的消息死亡對其他隊列中相同消息的生命沒有影響.

伺服器保證不會使用

basic.deliver

(發送給消費者)或者包含在

basic.get-ok

響應(對于一次性擷取操作)中來傳遞死消息.

此外,伺服器會嘗試在基于TTL的到期時或之後不久删除消息.

描述TTL周期(以毫秒為機關)的TTL參數或政策的值必須是非負整數.是以,值1000意味着添加到隊列的消息将在隊列中存活1秒或直到它被傳遞給消費者.參數可以是AMQP 0-9-1類型

short-short-int

short-int

long-in

t或

long-long-int

.

3 使用政策為隊列定義消息TTL

要使用政策指定TTL,在Linux中,請将key “message-ttl”添加到政策定義中:

這對所有隊列應用60秒的TTL.

4 在聲明時使用 x-參數 為隊列定義消息的TTL

以下示例建立一個消息最多可駐留60秒的隊列:

RabbitMQ實戰指南之Time-To-Live and Expiration

可以将消息TTL政策應用于已經包含消息的隊列,但這涉及一些警告.

如果消息被重新排隊(例如,由于使用了具有重新排隊參數的AMQP方法,或者由于通道關閉),則保留消息的原始到期時間.

将TTL設定為0會導緻消息在到達隊列時過期,除非它們可以立即傳遞給消費者.

是以,這提供了

立即

釋出标志的替代方案,RabbitMQ伺服器不支援該标志.

與那個标志不同,沒有釋出

basic.returns

,如果設定了死信交換,那麼消息将被删除.

5 釋出者中的 Per-Message TTL

通過在發送

basic.publish

時設定基本的AMQP 0-9-1類中的

expiration

字段,可以在每個消息的基礎上指定TTL.

expiration

字段的值描述TTL時間段(以毫秒為機關).适用與

x-message-ttl

相同的限制.

由于

expiration

字段必須是字元串,是以broker将(僅)接受該數字的字元串表示形式.

當指定了每個隊列和每個消息的TTL時,将選擇使用兩者之間的較小值.

6 Caveats

參考