RocketMq消费失败时如何处理?

193 阅读1分钟

RocketMq消费失败时处理机制

消费端处理机制

消费者消费失败后,会把消费发回给 Broker 进行处理。下图是客户端处理流程:

image.png

注意点:

  1. 广播消费模式下,消息失败会直接丢弃,不会发送回Broker端
  2. 集群消费模式下,发回Broker的消息,topic会修改为重试的topic,如果发送失败,则在等待5s后会在本地继续消费。
  3. 在拉取到一批消息进行消费时,只要有一条消息消费失败,这批消息都会进行重试,因此消费端做好幂等是必要的

如果发送回 Broker 时抛出异常,需要重新发送一个新的消息,这里有四点需要注意:

  • 新消息的 Topic 变成【 %RETRY% + consumerGroup】;
  • 新消息的 RETRY_TOPIC 这个属性赋值为之前的 Topic;
  • 新消息的重试次数属性加 1;
  • 新消息的 DELAY 属性等于重试次数 + 3.

Broker处理机制

Broker 收到消息后,会把消息重新发送到 CommitLog,发送到 CommitLog 之前,首先会修改 Topic 为 SCHEDULE_TOPIC_XXXX,这样就发送到了延时队列,延时队列再根据延时级别把消息投递到原始的队列,这样消费者就能再次拉取到。

image.png