消息队列RabbitMQ版的死信Exchange适用于处理被消费者否定应答或重试失败的消息。本文介绍死信Exchange的核心概念、路由流程、配置方式、注意事项和更多信息。

核心概念

死信Exchange
用于路由死信消息的Exchange。死信Exchange会根据Binding Key、死信Routing Key、Header属性将死信消息投递至死信Queue。死信Exchange可以是任何一种常见类型的Exchange,例如Direct Exchange。
死信Routing Key
死信消息的路由规则。如果不设置死信消息的Routing Key,则死信消息的Routing Key默认为消息本身的Routing Key。
死信消息
被重新发送到死信Exchange的消息。消息变成死信消息的可能原因如下:
  • requeue参数被设置为 false,消费者使用basic.rejectbasic.nack否定应答(NACK)消息。
  • 消息重试超过16次,消息重试失败。更多信息,请参见消息重试
注意 过期消息或超过队列最大长度被丢弃的消息不会成为死信消息。
死信Queue
死信Exchange绑定的Queue,用于存储死信消息。

路由流程

死信Exchange路由死信消息的流程如下:

  1. 生产者将消息发送到Exchange。
  2. Exchange将消息路由到Queue。
  3. 消费者从Queue拉取消息。
  4. 消费者消费失败后消息重试超过16次重试失败,或者消费者没有消费消息而直接否定应答,消息变成死信消息。
  5. Queue根据x-dead-letter-exchange将死信消息发送到死信Exchange,并根据x-dead-letter-routing-key为死信消息设置死信Routing Key。
  6. 死信Exchange将死信消息路由到死信Queue。
dg_dead_letter_message_flow

配置方式

消息队列RabbitMQ版支持以下方式配置死信Exchange:

  • 控制台

    您可以在消息队列RabbitMQ版控制台创建Queue时,为其配置死信Exchange。

    1. 登录消息队列RabbitMQ版控制台
    2. 在顶部菜单栏,选择地域。
    3. 在左侧导航栏,单击Queue管理
    4. Queue管理页面,选择实例,选择Vhost,单击创建Queue
    5. 创建Queue对话框,设置Queue属性,然后单击确定createdeadqueue
  • API

    您可以在通过API创建Queue时,为其配置死信Exchange。更多信息,请参见 CreateQueue

  • 客户端

    您可以在消息队列RabbitMQ版客户端声明Queue时,为其配置死信Exchange。您可以通过x-dead-letter-exchangex-dead-letter-routing-key设置死信消息要发送的Exchange以及死信消息的Routing Key。例如,声明一个名称为some.exchange.name、类型为direct的Exchange,使用 x-dead-letter-exchange将该Exchange设置为死信Exchange,使用x-dead-letter-routing-key将死信消息的Routing Key设置为demo-routing-key。Java示例代码如下:

    channel.exchangeDeclare("demo.exchange.name", "direct");
    Map<String, Object> args = new HashMap<String, Object>();
    arguments.put("x-dead-letter-exchange", "some.exchange.name");
    arguments.put("x-dead-letter-routing-key", "demo-routing-key");
    channel.queueDeclare("MyQueue", false, false, false, arguments);

注意事项

  • 消息队列RabbitMQ版不支持跨Vhost路由死信消息,即Queue被指定的死信Exchange必须和该Queue在同一个Vhost内。
  • 消息队列RabbitMQ版不支持修改Queue的死信Exchange。如果您需要修改某个Queue的死信Exchange,您需要删除该Queue后,在重新创建时设置死信Exchange。

更多信息