RabbitMQ死信佇列

2022-08-10 08:03:08 字數 1499 閱讀 2569

死信佇列

dlx,全稱為dead-letter exchange,可以稱之為死信交換器,也有人稱之為死信郵箱.當訊息在乙個佇列中變成死信(dead message)之後,它能被重新被傳送到另乙個交換器中,這個交換器就是dlx,繫結dlx的佇列就稱之為死信佇列。

訊息變成死信-般是由於以下幾種情況:

1.訊息被拒絕(basic.reject或basic.nack)並且requeue=false.

2.訊息ttl過期【訊息由於訊息有效期(per-message ttl)過期】

3.佇列達到最大長度(佇列滿了,無法再新增資料到mq中)

訊息變成死信後,會被重新投遞(publish)到另乙個交換機上(exchange),這個交換機往往被稱為dlx(dead-letter-exchange)「死信交換機」,然後交換機根據繫結規則**到對應的佇列上,監聽該佇列就可以被重新消費。

應用場景分析

在定義業務佇列的時候,可以考慮指定乙個死信交換機,並繫結乙個死信佇列,當訊息變成死信時,該訊息就會被傳送到該死信佇列上,這樣就方便我們檢視訊息失敗的原因了

死信處理過程

死信處理過程

dlx也是乙個正常的exchange,和一般的exchange沒有區別,它能在任何的佇列上被指定,實際上就是設定某個佇列的屬性。

當這個佇列中有死信時,rabbitmq就會自動的將這個訊息重新發布到設定的exchange上去,進而被路由到另乙個佇列。

生產者   -->  訊息 --> 交換機  --> 佇列  --> 變成死信  --> dlx交換機 -->佇列 --> 監聽--> 消費者

路由死信訊息

死信訊息將被佇列的死信交換機路由到其他佇列,在路由時有兩種情況:

1.使用在宣告佇列時指定的死信路由關鍵字

2.沒有設定時,使用訊息自身原來的路由關鍵字

例如,如果你使用foo作為路由關鍵字傳送了一條訊息到交換機,當訊息成為死信後,它使用foo作為路由關鍵字被傳送到佇列的死信交換機。如果佇列在宣告時指定"x-dead-letter-routing-key"的值為bar,那麼訊息被傳送到死信交換機時將會使用bar作為路由關鍵字。

注意,如果佇列沒有設定死信路由關鍵字,那訊息被死信路由時將會使用它自身的原始路由關鍵字。這包含了cc和bcc頭引數設定的路由關鍵字。

當死信訊息被重新傳送時,訊息確認機制也會在內部被開啟,因此,在原始佇列刪除這條訊息之前,訊息最終到達的佇列—死信佇列必須確認該訊息。換句話說,傳送佇列在接收到死信佇列的確認訊息之前不會刪除原始訊息。注意,如果在特殊情況下伺服器宕機,那麼同樣的訊息將會在原始佇列和死信佇列中同時出現。

訊息的死信路由可能會形成乙個迴圈。比如,乙個佇列的死信的訊息沒有使用指定的死信路由關鍵字被傳送到預設的交換機時。訊息在整個迴圈(訊息到達同乙個佇列兩次)中沒有被拒絕,那麼訊息將被丟棄。

對於rabbitmq來說,dlx是個非常有用的特性。在訊息不能夠被消費者正常消費(訊息被拒絕:basic.reject或basic.nack)的情況下,訊息會被放在死信佇列中,因此分析程式可以借助分析死信佇列的訊息來改善和優化系統。

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...