一、 什么是死信队列
死信队列是一种特殊的消息队列,用于集中处理无法被正常消费的消息的队列。当消息在重试队列中达到一定重试次数后仍未能被正常消费,TDMQ Pulsar 版会判定这条消息在当前情况下无法被消费,将其投递至死信队列。
二、 死信队列使用场景
实际场景中,消息可能会由于持续一段时间的服务宕机,网络断连而无法被消费。这种场景下,消息不会被立刻丢弃,死信队列会对这种消息进行较为长期的持久化,用户可以在找到对应解决方案后,创建消费者订阅死信队列来完成对当时无法处理消息的处理。
当消息进入到死信队列中,表示 TDMQ Pulsar 版已经无法自动处理这批消息,一般这时就需要人为介入来处理这批消息。您可以通过编写专门的客户端来订阅死信 Topic,处理这批之前处理失败的消息。
三、死信队列的检查:
可登录控制台,找到队列模块,在列表里头可以找到死信队列。
如果是 client 端自动创建的订阅,可以通过控制台上的 Topic管理 > 更多 > 查看订阅进入消费管理页面手动重建重试和死信队列。
四、创建死信队列
这里以 Java 语言客户端为例,在 topic1
创建了一个 sub1
的订阅,客户端使用 sub1
订阅名订阅了 topic1
并开启了 enableRetry
,如下所示:
Consumer consumer = client.newConsumer()
.topic("persistent://1******30/my-ns/topic1")
.subscriptionType(SubscriptionType.Shared)//仅共享消费模式支持重试和死信
.enableRetry(true)
.subscriptionName("sub1")
.subscribe();
此时,topic1
对 sub1
的订阅就形成了带有重试机制的投递模式,sub1
会自动订阅之前在新建订阅时自动创建的重试 Topic 中(可以在控制台 Topic 列表中找到)。当 topic1
中的消息投递第一次未收到消费端 ACK 时,这条消息就会被自动投递到重试 Topic ,并且由于 consumer 自动订阅了这个主题,后续这条消息会在一定的 重试规则下重新被消费。当达到最大重试次数后仍失败,消息会被投递到对应的死信队列,等待人工处理。