RocketMQ 消息怎么进入到 死信队列?
RocketMQ中消息进入死信队列的过程如下:
- 当一条消息初次消费失败,RocketMQ会自动进行消息重试。达到最大重试次数后(默认是16次),如果消费依然失败,这表明消费者在正常情况下无法正确地消费该消息。此时,RocketMQ不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。RocketMQ将这种在正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储这些死信消息的特殊队列称为死信队列(Dead-Letter Queue,简称DLQ)。
- 每个消费组在RocketMQ中都会有一个对应的死信队列,其Topic名称为“%DLQ%”加上消费组的名称。死信队列中的消息需要人工干预处理。在RocketMQ中,可以通过控制台对死信队列的权限进行更改,使其可读可写,然后对消息进行重发,或者订阅对应的Topic,使得消费者实例再次进行消费。
另外,如果消息延时级别小于0,消息也会立即被放入死信队列。
RocketMQ 消息进入到死信队列还能被消费吗?
能被消费。
死信队列(Dead-Letter Queue)是存储死信消息(Dead-Letter Message)的特殊队列,这些消息在正常情况下无法被消费者正常消费。在RocketMQ中,当消息重试超过一定次数后(默认是16次),消息会被放入死信队列。虽然死信消息不再被正常的消费者消费,但它们仍然可以被订阅和消费。
死信队列具有一些特性:
- 一个死信队列对应一个Group ID,而不是对应单个消费者实例。
- 如果一个Group ID未产生死信消息,RocketMQ不会为其创建相应的死信队列。
- 一个死信队列包含对应Group ID产生的所有死信消息,不论该消息属于哪个Topic。
需要注意的是,死信消息的有效期与正常消息相同,默认为3天,3天后会被自动删除。因此,需要在死信消息产生后的3天内及时处理这些消息,以避免消息丢失。
总的来说,虽然消息进入了死信队列,但仍然可以通过特定的方式进行消费和处理。
死信消息会被RocketMQ 保存吗?
会保存。
这些在正常情况下无法被消费者消费的消息被称为死信消息(Dead-Letter Message),并且会被存储在特殊的队列中,这个队列被称为死信队列(Dead-Letter Queue,简称DLQ)。此外,RocketMQ还支持将这些死信消息保存至指定的Topic,这样方便后续进行业务恢复或回溯。
当消息消费异常并且进行消费重试时,如果达到最大重试次数后,该消息就会转为死信状态。这时,RocketMQ会将其保存至指定的Topic。
ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!