RabbitMQ 死信/死信隊列

DLX

  • Dead Letter Exchange 的縮寫
  • DLX也叫死信郵箱(網上的譯法),死信交換機(字面翻譯)。歸根結底就是一個交換機,當隊列中出現死信時,經過這個交換機將死信從新發送到死信隊列中(指定好rabbitmq會自動發送)。

什麼是死信

什麼是死信呢?官方給出三個說法:測試

  • 消息被拒絕(basic.reject或basic.nack)而且requeue=false.
  • 消息TTL過時
  • 隊列達到最大長度(隊列滿了,沒法再添加數據到mq中)

什麼是死信交換機

在定義業務隊列的時候,要考慮指定一個死信交換機,死信交換機能夠和任何一個普通的隊列進行綁定,而後在業務隊列出現死信的時候就會將數據發送到死信隊列。ui

什麼是死信隊列

死信隊列實際上就是一個普通的隊列,只是這個隊列跟死信交換機進行了綁定,用來存放死信而已。翻譯

如何使用死信交換機

#####定義業務(普通)隊列的時候指定參數code

  • x-dead-letter-exchange: 用來設置死信後發送的交換機
  • x-dead-letter-routing-key:用來設置死信的routingKey

死信交換機圖解

![![輸入圖片說明]rabbitmq

建立業務隊列

@Bean
public Queue mailQueue() {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("x-dead-letter-exchange", "dead_letter_exchange");//設置死信交換機
    map.put("x-dead-letter-routing-key", "mail_queue_fail");//設置死信routingKey
    Queue queue = new Queue("mailQueue",true, false, false, map);
    return queue;
}

建立業務交換機

@Bean
public DirectExchange mailExchange() {
	return new DirectExchange("mailExchange", true, false);
}

綁定業務隊列和交換機,指定routingKey

@Bean
public Binding mailBinding() {
	return BindingBuilder.bind(mailQueue()).to(mailExchange())
			.with(mailRoutingKey);
}

建立死信隊列

@Bean
public Queue deadQueue(){
	Queue queue = new Queue("dead", true);
	return queue;
}

綁定死信隊列和死信交換機

@Bean
public Binding deadLetterBindding(){
	return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with("mail_queue_fail");
}

查看建立後的隊列和exchange

開始打算定義一個mailErrorQueue來記錄消費失敗的消息的,後來感受不是特別方便,用RabbitMQ自帶的死信郵件機制更好一些。 DLX即死信交換機,DLK即死信路由鍵(routingKey)隊列

輸入圖片說明

測試數據進入死信隊列

當咱們消費的時候經過使用basic.reject和basic.nack便可,我這裏使用的是reject。 channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);圖片

相關文章
相關標籤/搜索