# 配置RabbitMQ死信消息
死信是RabbitMQ中的一种消息机制，在消费消息时，如果队列里的消息符合以下任意一种情况，该消息将成为"死信"。
- "requeue"被设置为"false"，消费者使用"basic.reject"或"basic.nack"否定应答（NACK）消息。
- 消息在队列的存活时间超过设置的[TTL](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq-ug-0056.html)时间。
- 队列的消息数量已经超过最大队列长度。
死信消息会被RabbitMQ进行特殊处理，如果配置了死信队列，该消息将会被存储到死信队列中，如果没有配置死信队列，该消息将会被丢弃。
更多关于死信的说明，请参考[Dead Letter Exchanges](https://www.rabbitmq.com/dlx.html)。
#### 约束与限制
在RabbitMQ中，使用死信可能会对性能产生负面影响，请慎用。
#### 死信消息路由流程
![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002625016119.png "点击放大")
1. 生产者将消息发送到Exchange。
2. Exchange将消息路由到Queue。
3. 消费者从Queue拉取消息。
4. 当触发死信条件（消息过期/消息数量达到上限/消费者否定应答消息）时，会产生死信消息。
5. Queue根据x-dead-letter-exchange将死信消息发送到死信Exchange，并根据x-dead-letter-routing-key为死信消息设置死信路由Key。
6. 死信Exchange将死信消息路由到死信Queue。
 
#### 配置死信Exchange和Routing Key
您可以通过客户端或RabbitMQ控制台配置死信Exchange和Routing Key。
- [在Java客户端配置Exchange和Routing Key]
  为队列配置死信Exchange，并在创建队列时指定"x-dead-letter-exchange"和"x-dead-letter-routing-key"参数。队列根据"x-dead-letter-exchange"将死信消息发送到死信Exchange中，并根据"x-dead-letter-routing-key"为死信消息设置死信路由Key。
  以下示例演示在**Java客户端**配置死信交换机和路由：
  ```
  channel.exchangeDeclare("some.exchange.name", "direct");
  Map<String, Object> args = new HashMap<String, Object>();
  args.put("x-dead-letter-exchange", "some.exchange.name");
  args.put("x-dead-letter-routing-key", "some-routing-key");
  channel.queueDeclare("myqueue", false, false, false, args);
  ```
- [在RabbitMQ控制台配置死信Exchange和Routing Key]
  1. 参考[创建RabbitMQ Queue](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0029.html)创建队列，并在"死信交换器"中选择死信Exchange，"死信路由器"中输入死信Routing Key。
     
     图1配置死信Exchange和Routing Key   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002523778535.png "点击放大")
     
     
  
  2. 在Queue列表中，单击新创建的队列后的"查看详情"，进入"查看详情"页面。 
     当"死信交换器"和"死信路由键"为[1]中设置的信息时，表示死信Exchange和Routing Key配置成功。
     图2查看死信交换器和路由键   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002523899201.png "点击放大")
     
     
   
