RocketMQ实战之 消息重试

1,357 阅读1分钟

集群消费模式下,消息消费失败后,Broker会通过消息重试机制重新投递消息。

只有消费模式为 MessageModel.CLUSTERING(集群模式) 时,Broker才会自动进行重试,广播模式不会重试。

什么情况属于消息消费失败?

  1. 消费端返回ConsumeConcurrentlyStatus.RECONSUME_LATER
  2. 消费端返回null
  3. 消费端抛出异常并且未被捕获

对于一直消费不成功的消息达到最大重试次数(16次)后,会投递到死信队列并设置为消费成功

消息消费重试

// 消息延迟级别定义
private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";
重试次数为1时,对应第一次发送时间间隔为10s,然后依次类推

RocketMQ采用了“时间衰减策略”进行消息的重复投递,即重试次数越多,消息消费成功的可能性越小。

对于重试消息,会复制一个新的消息并备份Topic和QueueId投递到主题SCHEDULE_TOPIC_XXXX下,然后由定时任务进行调度重试,重试时在恢复到原来的队列

消息发送重试

消息发送失败后会自动重试,默认重试2次。

可通过消息记录表记录消息的信息和发送状态,对发送失败的消息进行补偿

/**设置消息发送失败时最大重试次数,默认2次*/
public void setRetryTimesWhenSendFailed(int retryTimesWhenSendFailed) {
     this.retryTimesWhenSendFailed = retryTimesWhenSendFailed;
}
 
 /**同步发送消息,并指定超时时间*/
public SendResult send(Message msg,long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
    return this.defaultMQProducerImpl.send(msg, timeout);
}