RocketMQ源码之消息重试!

重试时间

消息消费失败后,并不会立即重试,而是有一个递增的时间间隔来进行重试,重试次数默认16次。

只比延迟消息的时间间隔等级少了前两个,延迟消息总共有 18 个等级。

  • 而消息重试使用了原延迟消息的第 3 - 18 等级
1
10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

基本原理

重试的 MessageRocketMQ 的做法并不是将其投递回原 Topic,而是重试队列

每个 ConsumerGroup 都有自己的重试队列:

  • 其名称是由特定的前缀拼接上 ConsumerGroup 所组成,默认 %RETRY%+消费者组名称
  • 所以在 Consumer 启动时,就会同时消费其 ConsumerGroup 对应的重试队列普通队列

消费失败的 MessageConsumer 会将其投回 Broker

  • 相当于这条 Message 已经被消费掉了,之后重试的只是内容相同、但实际不是同一条的 Message
  • 然后会校验重试的次数,如果达到16次则会进入死信队列 组成为 %DLQ%+消费者组名称
  • 未达到最大重试次数,则会根据重试间隔时间等级将其投递到延迟队列SCHEDULE_TOPIC_XXXX中。
  • 然后等到了延迟等级对应的时间之后,再投递到 ConsumerGroup 所对应的重试队列当中,供后续消费。