RabbitMQ死信隊列

DLX,Dead-Letter-Exchange,死信交換器。當消息在一個隊列中變成死信,能被重新發送到另一個交換器中,這個交換器就是DLX,綁定DLX的隊列就稱之爲死信隊列。
消息變成死信一般由以下幾種情況:

  • 消息被拒絕(Basic.Reject/Basic.Nack),並設置requeue參數爲false
  • 消息過期
  • 隊列達到最大長度

爲隊列添加DLX

channel.exchangeDeclare("dlx_exchange","direct");//創建DLX:dlx_exchange
Map<String,Object> args = new HashMap<String,Object>();
args.put("x-dead-letter-exchange","dlx_exchange");
channel.queueDeclare("myqueue",false,false,false,args);

下面創建一個隊列,爲其設置TTL和DLX,代碼如下

channel.exchangeDeclare("exchange.dlx","direct",true);
channel.exchangeDeclare("exchange.normal","fanout",true);
Map<String,Object> args = new HashMap<String,Object>();
args.put("x-message-ttl",10000);
args.put("x-dead-letter-exchange","exchange.dlx");
args.put("x-dead-letter-routing-key","routingkey");
channel.queueDeclare("queue.normal",true,false,false,args);
channel.queueBind("queue.normal","exchange.normal","");
channel.queueDeclare("queue.dlx",true,false,false,null);
channel.queueBind("queue.dlx","exchange.dlx","routingkey");
channel.basicPublish("exchange.normal","rk",MessageProperties,PERSISTENT_TEXT_PLAIN,"dlx".getBytes());

這裏創建了兩個交換器exchange.normal和exchange.dlx,分別綁定兩個隊列queue.normal和queue.dlx

在這裏插入圖片描述
生產者首先發送一條攜帶路由鍵爲“rk”的消息,然後經過交換器exchange.normal順利的存儲到隊列queue.normal中。由於隊列queue.normal設置了過期時間10s,在這10s內沒有消費者消費這條消息,那麼判定這條消息爲過期。由於設置了DLX,過期之時,消息被丟給exchange.dlx中,這時找到exchange.dlx匹配的隊列queue.dlx,最後消息被存儲在queue.dlx這個死信隊列中。
對於RabbitMQ來說,DLX是一個非常有用的特性。他可以處理異常情況下,消息不能夠被消費者正常消費(消費者調用了Basic.Nack或者Basic.Reject)而被置入死信隊列中的情況,後續分析程序可以通過消費這個死信隊列中的內容來分析當時所遇到的異常情況,進而改善和優化系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章