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-int或long-long-int.
3 使用策略為隊列定義消息TTL
要使用策略指定TTL,在Linux中,請將key “message-ttl”添加到策略定義中:
這對所有隊列應用60秒的TTL.
4 在聲明時使用 x-參數 為隊列定義消息的TTL
以下示例創建一個消息最多可駐留60秒的隊列:
可以將消息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時,將選擇使用兩者之間的較小值.
以下示例使用RabbitMQ Java客戶端發布一條消息,該消息可以駐留在隊列中最多60秒:
6 Caveats
具有針對每個消息TTL追溯應用的隊列(當他們已經有消息時)將在特定事件發生時丟棄消息.
只有當過期的消息到達隊列的頭部時,它們才會被丟棄(或者被刪除字母).消費者不會向他們發送過期消息.
消息到期和消費者傳遞之間可能存在自然競爭條件,例如:郵件在寫入套接字之后但在到達使用者之前可能會過期。 設置每個消息的TTL過期消息可以在非過期消息之后排隊,直到后者消耗或過期。因此,這些過期消息使用的資源將不會被釋放,并且它們將被計入隊列統計中(例如隊列中的消息數)。 當追溯應用每消息TTL策略時,建議讓消費者聯機以確保更快地丟棄消息。 鑒于現有隊列上每個消息TTL設置的這種行為,當需要刪除消息以釋放資源時,應該使用隊列TTL(或隊列清除或隊列刪除)。 Queue TTL TTL也可以在隊列上設置,而不僅僅是隊列內容。隊列將在一段時間后過期,僅在不使用它們時(例如,沒有消費者)。此功能可與自動刪除隊列屬性一起使用。通過將x-expires參數設置為queue.declare,或者通過設置expires策略,可以為給定隊列設置 Expiry time。這可以控制隊列在自動刪除之前可以使用多長時間。未使用意味著隊列沒有消費者,隊列最近沒有重新聲明(重新聲明續訂租約),并且至少在有效期內沒有調用basic.get。例如,這可以用于RPC樣式的回復隊列,其中可以創建許多可能永遠不會被耗盡的隊列。 服務器保證隊列將被刪除,如果至少在有效期內未使用。不保證在到期期限過后如何及時刪除隊列。服務器重新啟動時,持久隊列的租約會重新啟動。 x-expires參數或expires策略的值描述了有效期(以毫秒為單位)。它必須是正整數(與消息TTL不同,它不能為0)。因此,值1000意味著將刪除未使用1秒的隊列。 使用策略為隊列定義隊列TTL以下策略使所有隊列在上次使用后30分鐘后到期: rabbitmqctl rabbitmqctl set_policy expiry“?!薄瘂“expires”:1800000}’ - apply-to queues rabbitmqctl(Windows) rabbitmqctl.bat set_policy expiry“。”“{”“expires”“:1800000}” - apply-to queues 在聲明期間使用x參數為隊列定義隊列TTL Java中的這個例子創建一個隊列,該隊列在未使用30分鐘后到期。 Map String,Object args = new HashMap String,Object(); args.put(“x-expires”,1800000); channel.queueDeclare(“myqueue”,false,false,false,args); 獲取幫助和提供反饋如果您對本指南的內容或與RabbitMQ相關的任何其他主題有疑問,請不要猶豫,在RabbitMQ郵件列表中詢問他們。 幫助我們改進文檔3 如果您想對網站做出改進,可以在GitHub上找到它的來源。只需分叉存儲庫并提交拉取請求。謝謝! 本節內容服務器文檔客戶端文檔插件新聞協議我們的擴展確認消費者取消消費者預取消費者優先級直接回復被阻止的連接basic.nack e2e綁定備用交換發件人路由TTL死字母長度限制優先級隊列驗證用戶ID驗證失敗規格差異構建以前的版本許可證
參考
RabbitMQ官網
RabbitMQ 視頻直播
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。