RabbitMQ死信佇列

2022-08-10 08:03:10 字數 2840 閱讀 4427

什麼是ttl
rabbitmq的ttl全稱為time-to-live,表示的是訊息的有效期。訊息如果在佇列中一直沒有被消費並且存在時間超過了ttl,訊息就會變成了"死信" (dead message),後續無法再被消費了。設定ttl有兩種方式:

第一種是宣告佇列的時候,在佇列的屬性中設定,這樣該佇列中的訊息都會有相同的有效期;

第二種是傳送訊息時給訊息設定屬性,可以為每條訊息都設定不同的ttl。

如果兩種方式都設定了,則以設定的較小的為準。兩者的區別:如果宣告佇列時設定了有效期,則訊息過期了就會被刪掉;如果是發訊息時設定的有效期,訊息過期了也不會被立馬刪掉,因為這時訊息是否過期是在要投遞給消費者時判斷的。至於為啥要這樣處理很容易想清楚:第一種方式佇列的訊息有效期都一樣,先入隊的在佇列頭部,頭部也是最早要過期的訊息,rabbitmq起乙個定時任務從佇列的頭部開始掃瞄是否有過期訊息即可;第二種方式每條訊息的過期時間不同,所以只有遍歷整個佇列才可以篩選出來過期的訊息,這樣效率太低了,而且訊息量大了之後根本不可行的,可以等到訊息要投遞給消費者時再判斷刪除,雖然刪除的不夠及時但是不影響功能,其實就是用空間換時間。

如果不設定ttl,則表示此訊息永久有效(預設訊息是不會失效的)。如果將ttl設為0,則表示如果訊息不能被立馬消費則會被立即丟掉,這個特性可以部分替代rabbitmq3.0以前支援的immediate引數,之所以所部分代替,是應為immediate引數在投遞失敗會有basic.return方法將訊息體返回(這個功能可以利用死信佇列來實現)。

設定ttl
1、設定佇列ttl

屬性名為x-message-ttl,單位為毫秒

2、**設定

設定佇列ttl

設定訊息ttl

3、檢視佇列

3、設定佇列的過期時間

上面在web管控臺新增佇列的時候,我們看到有乙個x-expires引數,可以讓佇列在指定時間內 "未被使用" 的話會自動過期刪除,未使用的意思是 queue 上沒有任何 consumer,queue 沒有被重新宣告,並且在過期時間段內未呼叫過 basic.get 命令。該方式可用於,例如,rpc-style 的回覆 queue, 其中許多queue 會被建立出來,但是卻從未被使用。

dlx-死信交換機
1、dlx是什麼

dlx是dead-letter-exchange的簡寫,意思是死信交換機。

它的作用其實是用來接收死信訊息(dead message)的。那什麼是死信訊息呢?一般訊息變成死信訊息有如下幾種情況:

訊息被拒絕(basic.reject/basic.nack) ,井且設定requeue 引數為false

訊息過期

佇列達到最大長度

當訊息在乙個佇列中變成了死信訊息後,可以被傳送到另乙個交換機,這個交換機就是dlx,繫結dlx的佇列成為死信佇列。當這個佇列中存在死信時, rabbitmq 就會立即自動地將這個訊息重新發布到設定的dlx 上去,進而被路由到繫結該dlx的死信佇列上。可以監聽這個佇列中的訊息、以進行相應的處理,這個特性與將訊息的ttl 設定為0 配合使用可以彌補imrnediate 引數的功能。

2、dlx有什麼用

因為訊息如果未被正常消費並設定了requeue為false時會進入死信佇列,我們可以監控消費死信佇列中訊息,來觀察和分析系統的問題。dlx還有乙個非常重要的作用,就是結合ttl實現延遲佇列(延遲佇列的使用範圍還是挺廣的:比如下單超過多長時間自動關閉;比如我們接入過第三方支付系統的同學一定知道,我們的訂單中會傳乙個notify_url用於接收支付結果知,如果我們給第三方支付響應的不是成功的訊息,其會隔一段時間繼續呼叫通知我們的notify_url,超過幾次後不再進行通知,一般通知頻率都是 0秒-5秒-30秒-5分鐘-30分鐘-1小時-6小時-12小時;比如我們的家用電器定時關機。。。。。。這些場景都是可以用延遲佇列實現的)。

3、dlx使用方式

下面在web管控臺新增佇列的時候,我們看到有兩個dlx相關的引數:x-dead-letter-exchange和x-dead-letter-routing-key。x-dead-letter-exchange是設定佇列的dlx的;x-dead-letter-routing-key是設定死信訊息進入dlx時的routing key的,這個是可以不設定的,如果不設定,則預設使用原佇列的routing key

私信流程
1訊息傳送到交換機normal_exchange,然後路由到佇列normal_queue上

2因為佇列normal_queue沒有消費者,訊息過期後成為死信訊息

3死信訊息攜帶設定的x-dead-letter-routing-key=dlx.test進入到死信交換機dlx_exechage

4dlx_exechage與dlx_queue繫結的routing key為"dlx.*",死信訊息的路由鍵dlx.test符合該規則被路由到dlx.queue上面。

延遲佇列可參考:

參考:《rabbitmq實戰指南》 朱忠華 編著; 

RabbitMq死信佇列

死信交換機有什麼用呢?在建立佇列的時候 可以給這個佇列附帶乙個交換機,那麼這個佇列作廢的訊息就會被重新發到附帶的交換機,然後讓這個交換機重新路由這條訊息。通俗的說,就是訊息產生之後,因為設定了超時時間,在這段時間內訊息沒有被消費就會被扔到死信佇列裡面。交換機名稱 private static fin...

rabbitmq死信佇列

死信佇列 dlx dead letter exchange 利用dlx,當訊息在乙個佇列中變成死信 dead message 之後,它能重新publish到另外乙個exchange,這個exchange就是dxl 訊息變成死信的幾種情況 訊息被拒絕 basic.reject basic.nack 並...

rabbitmq死信佇列

概念 當訊息成為死信時,會將該訊息放到死信交換機當中,這個交換機也繫結的其他佇列,還可以繼續進行消費。訊息什麼時候會變成死信 在配置檔案宣告佇列時指定死信交換機的名稱和死信交換機的路由key key x dead letter exchange value 死信交換機名稱 key x dead le...