天天看點

RabbitMQ之死信隊列

DLX, Dead-Letter-Exchange。利用DLX, 當消息在一個隊列中變成死信(dead message)之後,它能被重新publish到另一個Exchange,這個Exchange就是DLX。消息變成死信一向有一下幾種情況:

消息被拒絕(basic.reject/ basic.nack)并且requeue=false

隊列達到最大長度

核心代碼實作:通過在queueDeclare方法中加入“x-dead-letter-exchange”實作。

你也可以為這個DLX指定routing key,如果沒有特殊指定,則使用原隊列的routing key

還可以使用policy來配置:

通過RabbitMQ的管理界面可以看到:

RabbitMQ之死信隊列

queue.dlx.test這個queue中有個“DLX”和“DLK”的标記. DLX關聯的是exchangeName, DLK關聯的是routingKey.

詳細說明:

在RabbitMQ中有兩個exchange: exchange.dlx.self和exchange.dlx.test,兩個queue:queue.dlx.test和%DLX%queue.dlx.test

exchange.dlx.self是正常情況下,生産者發送消息到此exchange中,綁定關系如圖:

RabbitMQ之死信隊列

exchang.dlx.test是産生死信之後,原queue[queue.dlx.test]的死信發送到此exchange中,綁定關系如圖:

RabbitMQ之死信隊列

資料首先發送到 exchange[exchange.dlx.self],根據routingkey[dlx]路由到queue.dlx.test,如果正常情況下,消費者可以消費queue.dlx.test的内容。但是如果queue.dlx.test中有消息變成了dead message即死信了,那麼這個死信則會通過exchangeName=exchange.dlx.test, routingKey=”queue.dlx.test”路由到死信隊列%DLX%queue.dlx.test中,如果要消費這個dead message, 此時消費者必須消費%DLX%queue.dlx.test中的内容而不是queue.dlx.test中的内容。

如果不指定x-dead-letter-routing-key參數,則使用原來的routingkey

<a href="http://blog.csdn.net/u013256816/article/details/54916011">RabbitMQ之TTL(Time-To-Live 過期時間)</a>

<a href="http://blog.csdn.net/u013256816/article/details/54914525">RabbitMQ之mandatory和immediate</a>

<a href="http://blog.csdn.net/jiao_fuyou/article/details/22923935">RabbitMQ(四)RabbitMQ死信郵箱(DLX)</a>

<a href="http://www.rabbitmq.com/dlx.html">RabbitMQ Dead Letter Exchanges</a>