当一条消息初次消费失败,消息队列会自动进行消息重试。达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息。此时,消息队列不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。在消息队列中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),死信队列(Dead-Letter Queue)用于存储及处理这些无法被正常消费的死信消息。
本文通过介绍如何查询和重新发送进入死信队列的死信消息,以便您按需管理死信消息,避免消息漏处理。
特性说明
死信队列
一个死信队列对应一个 Group ID, 而不是对应单个消费者实例。
如果一个 Group ID 未产生死信消息,消息队列不会为其创建相应的死信队列。
一个死信队列包含了对应 Group ID 产生的所有死信消息,不论该消息属于哪个 Topic。
死信消息
不会再被消费者正常消费。
有效期与正常消息相同,均为 3 天,3 天后会被自动删除。因此,请在死信消息产生后的 3 天内及时处理。
查询死信消息
消息队列提供以下两种查询死信消息的方式:
按 Group ID 查询:根据 Group ID 和时间范围,批量获取符合条件的所有消息;查询量大,不易匹配。
按 Message ID 查询:根据 Group ID 和 Message ID 可以精确定位任意一条消息。
按 Group ID 查询
您可以根据 Group ID 和死信消息产生的时间范围,批量查询该 Group ID 在某段时间内产生的所有死信消息。
死信消息产生的时间是指一条消息在投递重试达到最大次数后被发送到死信队列的时间。
操作步骤
登录 SOFAStack 控制台。
在左侧导航栏,选择 中间件 > 消息队列 > 死信队列。
单击 按 Group ID 查询。在 Group ID 的输入框中,输入关键词搜索想要查找的 Group ID,然后选中,或直接在下拉列表中选择想要查找的 Group ID。
单击时间选择框,选择想要查询的时间范围的起止日期和具体时间点。
单击 搜索,页面中会显示所有符合以上条件的死信消息。
单击目标死信消息操作列的 消息详情,即可查看该消息的详细信息,包括消息体大小、基本属性等。
单击目标死信消息操作列中的 消息轨迹,即可进入 消息轨迹 页面,查询该消息轨迹。详见 查询消息轨迹。
按 Message ID 查询
按 Message ID 查询消息属于精确查询。您可以根据 Group ID 与 Message ID 精确查询到任意一条消息。
操作步骤
登录 SOFAStack 控制台。
在左侧导航栏,选择 中间件 > 消息队列 > 死信队列。
单击 按 Message ID 查询,在 Group ID 的输入框中,输入关键词搜索想要查找的 Group ID,然后选中,或直接在下拉列表中选择想要查找的 Group ID。
在 Message ID 的输入框中,输入想要查找的消息的 Message ID。
单击 搜索,页面中会显示所有符合以上条件的死信消息。
单击目标死信消息操作列的 消息详情,即可查看该消息的详细信息,包括基本属性、消息体的下载链接等。
单击目标死信消息操作列中的 消息轨迹,即可进入 消息轨迹 页面,查询该消息轨迹。详见 查询消息轨迹。
消费验证
您还可以通过消费验证功能来验证指定的消费者应用是否能接受到消息。
消费验证功能仅仅是用于验证客户端的消费逻辑是否正常,并不会影响正常的收消息流程,因此消息的消费状态等信息在消费验证后并不会改变。
操作步骤:
在展开的死信消息详情页面中,单击 Group Id 操作列的 消费验证 。
在消费验证窗口中,选择目标消费者应用 IP。
单击 确定,该消息将会重新发送到指定 IP 上。
重新发送死信消息
一条消息进入死信队列,意味着某些因素导致消费者无法正常消费该消息,因此,通常需要您对其进行特殊处理。排查可疑因素并解决问题后,您可以在消息队列控制台重新发送该消息,让消费者重新消费一次。
死信消息被重新发送后,不会在死信队列中被立即删除。
单条重发在消息队列控制台按任意方式查询到死信消息后,在目标死信消息的操作列,单击 重新发送,重发该条死信消息。
批量重发在消息队列控制台按 Group ID 查询到死信消息后,勾选目标死信消息,然后单击页面下方的 批量重发 ,重新发送所有勾选的死信消息。