死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。
RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储死信消息的特殊队列称为死信队列(Dead-Letter Queue),简称DLQ。如果消息延时级别小于0,那么也会立即放入死信队列。
死信队列中的消息需要人工干预,在RocketMQ中,可以通过使用console控制台对死信队列的权限更改为读写,然后对消息进行重发来或者订阅对应的Topic使得消费者实例再次进行消费。
RocketMQ会为每个消费组都设置一个Topic名称为%DLQ%+consumerGroup的死信队列。这里需要注意的是,和重试队列一样,这里的死信队列是针对消费组,而不是针对每个Topic设置的。死信队列并不会一开始就创建,而是真正需要使用到的时候才会创建。
版本3.4.9之后,可通过consumer 客户端参数maxReconsumeTimes设置最大重试次数,超过最大重试次数,消息将被转移到死信队列,有效范围是-1 – 16之间。maxReconsumeTimes默认-1,对于有序消费模式表示默认本地Integer.MAX_VALUE次重试消费,每次间隔1s;对于并发无序消费模式MessageListenerConcurrently,表示默认16次延时消费,默认从Level 3开始。
相关文章:
RocketMQ
如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!