RocketMq消费失败时处理机制
消费端处理机制
消费者消费失败后,会把消费发回给 Broker 进行处理。下图是客户端处理流程:
注意点:
- 广播消费模式下,消息失败会直接丢弃,不会发送回Broker端。
- 集群消费模式下,发回Broker的消息,topic会修改为重试的topic,如果发送失败,则在等待5s后会在本地继续消费。
- 在拉取到一批消息进行消费时,只要有一条消息消费失败,这批消息都会进行重试,因此消费端做好幂等是必要的。
如果发送回 Broker 时抛出异常,需要重新发送一个新的消息,这里有四点需要注意:
- 新消息的 Topic 变成【 %RETRY% + consumerGroup】;
- 新消息的 RETRY_TOPIC 这个属性赋值为之前的 Topic;
- 新消息的重试次数属性加 1;
- 新消息的 DELAY 属性等于重试次数 + 3.
Broker处理机制
Broker 收到消息后,会把消息重新发送到 CommitLog,发送到 CommitLog 之前,首先会修改 Topic 为 SCHEDULE_TOPIC_XXXX,这样就发送到了延时队列,延时队列再根据延时级别把消息投递到原始的队列,这样消费者就能再次拉取到。