死信队列
背景信息
当一条消息初次消费失败,消息队列 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 可以精确定位任意一条消息。 |
注意 死信消息产生的时间是指一条消息在投递重试达到最大次数后被发送到死信队列的时间。
导出死信消息
若您暂时无法处理死信消息,可以在消息队列 RocketMQ 版控制台上将其导出,以免超过有效期。
消息队列 RocketMQ 版控制台提供对死信消息的单条导出和批量导出功能。导出的文件格式为 CSV。
导出的消息内容如下表所示。
重新发送死信消息
一条消息进入死信队列,意味着某些因素导致消费者无法正常消费该消息,因此,通常需要您对其进行特殊处理。排查可疑因素并解决问题后,您可以在消息队列 RocketMQ 版控制台重新发送该消息,让消费者重新消费一次。
注意 死信消息被重新发送后,不会在死信队列中被立即删除。