死信队列用于处理无法被正常消费的消息,即死信消息。本文介绍如何查询、导出和重新发送进入死信队列的死信消息,以便您按需管理死信消息,避免消息漏处理。

背景信息

当一条消息初次消费失败,消息队列RocketMQ版会自动进行消息重试,达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息。此时,消息队列RocketMQ版不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

消息队列RocketMQ版中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。

特性说明

死信消息具有以下特性:

  • 不会再被消费者正常消费。
  • 有效期与正常消息相同,均为3天,3天后会被自动删除。因此,请在死信消息产生后的3天内及时处理。

死信队列具有以下特性:

  • 一个死信队列对应一个Group ID, 而不是对应单个消费者实例。
  • 如果一个Group ID未产生死信消息,消息队列RocketMQ版不会为其创建相应的死信队列。
  • 一个死信队列包含了对应Group ID产生的所有死信消息,不论该消息属于哪个Topic。

消息队列RocketMQ版控制台提供对死信消息的查询、导出和重发的功能。

查询死信消息的方式

消息队列RocketMQ版提供的查询死信消息的方式对比如下表所示。

查询方式 查询条件 查询类别 说明
按Group ID查询 Group ID + 时间段 范围查询 根据Group ID和时间范围,批量获取符合条件的所有消息;查询量大,不易匹配。
按Message ID查询 Group ID + Message ID 精确查询 根据Group ID和Message ID可以精确定位任意一条消息。

查询死信消息

  1. 登录消息队列RocketMQ版控制台
  2. 在左侧导航栏,单击实例列表
  3. 在顶部菜单栏,选择地域,如华东1(杭州)
  4. 实例列表页面,找到目标实例,在其操作列,单击更多,然后在下拉列表,选择死信队列
  5. 死信队列页面,您可选择以下任一方式查询死信消息:
    • 按 Group 查询

      根据Group ID和死信消息产生的时间范围,批量查询该Group ID在某段时间内产生的所有死信消息。

      注意 死信消息产生的时间是指一条消息在投递重试达到最大次数后被发送到死信队列的时间。

      页面中会显示所有符合筛选条件的死信消息。

      dead_letter_group_id
    • 按 Message ID 查询

      按Message ID查询消息属于精确查询。您可以根据Group ID与Message ID精确查询到任意一条消息。

      页面中会显示所有符合筛选条件的死信消息。

      dead_letter_message_id

导出死信消息

若您暂时无法处理死信消息,可以在消息队列RocketMQ版控制台上将其导出,以免超过有效期。

消息队列RocketMQ版控制台提供对死信消息的单条导出和批量导出功能。导出的文件格式为CSV。

导出的消息内容如下表所示。

消息字段 字段含义
instanceId 消息队列RocketMQ版实例ID。
topic 消息所属的Topic。
msgId 消息的ID。
bornHost 消息产生的地址。
bornTimestamp 消息产生的时间戳。
storeTimestamp 消息存储到消息队列RocketMQ版服务端的时间戳。
reconsumeTimes 消费失败的次数。
properties 消息属性;JSON格式。
body 消息体;Base64编码格式。
bodyCRC 消息体CRC。
  • 单条导出

    消息队列RocketMQ版控制台按任意方式查询到死信消息后,在某条死信消息的操作列,单击更多,然后在下拉列表中,选择导出消息,导出该条死信消息。

  • 批量导出

    消息队列RocketMQ版控制台按Group ID查询到死信消息后,勾选目标死信消息,然后单击批量导出消息,导出所有勾选的死信消息。

重新发送死信消息

一条消息进入死信队列,意味着某些因素导致消费者无法正常消费该消息,因此,通常需要您对其进行特殊处理。排查可疑因素并解决问题后,您可以在消息队列RocketMQ版控制台重新发送该消息,让消费者重新消费一次。

注意 死信消息被重新发送后,不会在死信队列中被立即删除。
  • 单条重发

    消息队列RocketMQ版控制台按任意方式查询到死信消息后,在某条死信消息的操作列,单击更多,然后在下拉列表中,选择重新发送,重发该条死信消息。

  • 批量重发

    消息队列RocketMQ版控制台按Group ID查询到死信消息后,勾选目标死信消息,然后单击批量重新发送消息,重新发送所有勾选的死信消息。