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

背景信息

当一条消息初次消费失败,消息队列 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 版控制台。在顶部菜单栏,选择地域(Region),如华东1(杭州)
  2. 实例列表页面,找到目标实例,在其操作列,单击详情
  3. 在左侧导航栏,单击死信队列
  4. 死信队列页面,您可单击以下任一页签,然后按页面提示输入相应信息,再单击搜索查询。
    • 按 Group ID 查询

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

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

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

      DL-by-groupid
    • 按 Message ID 查询

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

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

      DL-by-messageid
  5. 找到想要查看的死信消息,在其操作列单击查看详情查看该消息的详细信息。msg_detail
  6. (可选)单击消费验证将指定消息推送给指定的在线客户端,以检测客户端消费该消息的逻辑和结果是否符合预期。
    注意 消费验证功能仅仅是用于验证客户端的消费逻辑是否正常,并不会影响正常的收消息流程,因此消息的消费状态等信息在消费验证后并不会改变。
    consume-validate

导出死信消息

若您暂时无法处理死信消息,可以在消息队列 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 查询到死信消息后,勾选目标死信消息,然后单击页面下方的批量重发,重新发送所有勾选的死信消息。