描述 rocketmq 消息重试和死信队列机制
前言
当消息消费失败时, rocketmq 支持消费失败的消息进行重新消费。当重试一定次数后,会将消息放到死信队列,在系统恢复正常后,可以由死信队列读取原来的消息重新进行消费。
重试实现
不同类型的 consumer 重试的机制不一样,这里只分析 PUSH 模型
Concurrently / CLUSTERING
这个场景,消息消费失败后, consumer 向 broker 发送 CONSUMER_SEND_MSG_BACK 命令将消息存到 %RETRY% topic,同组的 consumer 会再从 %RETRY% topic 拉取消息进行重新消费。
消息重试一定次数后,将会发到死信队列 %DLQ% topic, 不再进行重试,需要手工重新消费。
consumer 代码
1 | // 消费代码,这里会抛出除零异常,效果与返回 ConsumeConcurrentlyStatus.RECONSUME_LATER 一样 |
Concurrently / BROADCASTING
这种情况不会重试
Orderly
消费代码抛出异常或返回 ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 的效果是一样的
由于顺序消息需要保证消息在同一个 consumer 下进行消费,所以重试并不需要将消息发回 broker, 而是在 consumer 本地重新消费
当超出最大重试次数时,才会发回 broker。如果还是消费失败,就将消息放到死信队列,同 Concurrently 一样
consumer 代码
1 |
|