阿里云消息队列查询、导出和重新发送进入死信队列的死信消息

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

背景信息

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

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

特性说明

死信消息具有以下特性:

不会再被消费者正常消费。

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

死信队列具有以下特性:

一个死信队列对应一个 Consumer ID, 而不是对应一个的消费者(Consumer)。

当一个 Consumer ID 未产生死信时,RocketMQ不会为其创建相应的死信队列。

一个死信队列包含了对应 Consumer ID 产生的所有死信消息,不论该消息属于哪个Topic。

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

查询死信消息

RocketMQ提供了以下两种查询死信消息的方式:

按“Consumer ID”+“时间段”查询

按“Consumer ID”+“Message ID”查询

这两种查询方式的对比如下表所示:

查询方式

查询条件

查询类别

       说明

按Consumer ID 查询+时间段

Consumer ID+时间段

范围查询

根据Consumer ID和时间范围,批量获取符合条件的所有消息;查询量大,不易匹配。

按Consumer ID 查询+Message ID

Consumer ID+Message ID

精确查询

根据Consumer ID和   Message ID可以精确定位任意一条消息。

导出死信消息

若您暂时无法处理死信消息,可以在RocketMQ控制台上将其导出,以免超过有效期。RocketMQ控制台提供对死信消息的单条导出和批量导出功能。导出的文件格式为CSV。

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

消息字段

字段含义

topic

消息所属的   Topic

msgId

消息的   ID

bornHost

消息产生的地址

bornTimestamp

消息产生的时间

storeTimestamp

死信消息产生的时间

reconsumeTimes

消费失败的次数

properties

消息属性;JSON 格式

body

消息体;base64 编码格式

bodyCRC

消息体   CRC

上面所说的“导出死信息消息功能点”支持以“单条导出”和“批量导出”两种方式导出。

单条导出

在消息队列RocketMQ控制台按任意方式查询到死信消息后,在某条死信消息的操作列,单击导出,导出该条死信消息。

批量导出

在消息队列RocketMQ控制台按Consumer ID查询到死信消息后,勾选目标死信消息,然后单击页面下方的批量导出按钮,导出勾选的所有死信消息。

重新发送死信消息

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

注意:死信消息被重新发送后,不会在死信队列中被立即删除。这里的“重新发送死信消息”功能点也支持“单条重新发送”和“批量重新发送”两种。

单条重发

在消息队列RocketMQ控制台按任意方式查询到死信消息后,在某条死信消息的操作列,单击重新发送,重发该条死信消息。

批量重发

在消息队列RocketMQ控制台按Consumer ID查询到死信消息后,勾选目标死信消息,然后单击页面下方的批量重发按钮,重新发送所有勾选的死信消息。