死信队列

对于消费失败且重试后依然失败的消息,云消息队列 RocketMQ 版不会立丢弃,而是将消息转发至指定的队列中,即死信队列,这些消息即为死信消息。当消费失败的原因排查并解决后,您可以重发这些死信消息,让消费者重新消费;若您暂时无法处理这些死信消息,为避免到期后死信消息被删除,您也可以先将死信消息导出进行保存。

背景信息

当一条消息初次消费失败,云消息队列 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. 在顶部菜单栏选择地域,如华东1(杭州),然后在实例列表中,单击目标实例名称。

  3. 在左侧导航栏单击死信队列,然后在死信队列页面,选择以下任一方式查询死信消息:

    • 按 Group 查询

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

      说明

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

    • 按 Message ID 查询

      按Message ID查询消息属于精确查询。您可以根据Group ID与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查询到死信消息后,勾选目标死信消息,然后单击批量重新发送消息,重新发送所有勾选的死信消息。

相关文档

关于消费重试的相关原理,请参见消息重试