Java小案例-RocketMQ的11种消息类型,你知道几种?(重试消息)

前言

RocketMQ的重试消息是指在消息发送或者消费过程中,如果出现异常或者未能成功处理的情况,系统会自动或者按照配置进行消息的重新发送或重新消费的过程。

具体来说:

  1. 生产者重试:当生产者发送消息到Broker时,如果因为网络问题、 Broker无响应或者其他原因导致消息发送失败,RocketMQ可以根据配置进行重试。生产者可以配置异步发送失败后的重试次数(rocketmq.producer.retry-times-when-send-async-failed)和同步发送失败后的重试次数(rocketmq.producer.retry-times-when-send-failed)。

  2. 消费者重试:在集群消费模式下,如果消费者在消费某条消息时出现异常或者未能成功处理消息,RocketMQ会将这条消息重新放回队列中,等待下次被消费。这种机制被称为消息重试或者延迟投递。消费者需要在消息监听器接口的实现中明确处理重试消息,并在消费成功后返回结果给Broker。

重试机制是RocketMQ保证消息可靠传输的重要手段之一,通过合理的重试策略,可以提高消息的送达率并降低因暂时性故障导致的消息丢失风险。同时,为了避免无限循环的重试,RocketMQ也提供了最大重试次数的配置以及死信队列的概念,当消息达到最大重试次数仍然无法成功消费时,会被放入死信队列,由开发者另行处理。

重试消息

重试消息并不是我们业务中主动发送的,而是指当消费者消费消息失败之后,会间隔一段时间之后再次消费这条消息

重试的机制在并发消费模式和顺序消费模式下实现的原理并不相同

并发消费模式重试实现原理

RocetMQ会为每个消费者组创建一个重试消息所在的Topic,名字格式为

%RETRY% + 消费者组名称

举个例子,假设消费者组为sanyouConsumer,那么重试Topic的名称为:%RETRY%sanyouConsumer

当消息消费失败后,RocketMQ会把消息存到这个Topic底下

消费者在启动的时候会主动去订阅这个Topic,那么自然而然就能消费到消费失败的消息了

Java小案例-RocketMQ的11种消息类型,你知道几种?(重试消息)_第1张图片

为什么要为每个消费者组创建一个重试Topic呢?

其实我前面已经说过,每个消费者组的消费是隔离的,互不影响

所以,每个消费者组消费失败的消息可能就不一样,自然要放到不同的Topic下了

重试消息是如何实现间隔一段时间来消费呢?

说到间隔一段时间消费,你有没有觉得似曾相识?

不错,间隔一段时间消费说白了不就是延迟消费么!

所以,并发消费模式下间隔一段时间底层就是使用的延迟消息来实现的

RocetMQ会为重试消息设置一个延迟级别

并且延迟级别与重试次数的关系为

delayLevel = 3 + 已经重试次数

比如第一次消费失败,那么已经重试次数就是0,那么此时延迟级别就是3

对应的默认的延迟时间就是10s,也就是一次消息重试消费间隔时间是10s

随着重试次数越多,延迟级别也越来越高,重试的间隔也就越来越长,但是最大也是最大延迟级别的时间

不过需要注意的是,在并发消费模式下,只有集群消费才支持消息重试,对于广播消费模式来说,是不支持消息重试的,消费失败就失败了,不会管

顺序消费模式重试实现原理

顺序消费模式下重试就比较简单了

当消费失败的时候,他并不会将消息发送到服务端,而是直接在本地等1s钟之后重试

在这个等待的期间其它消息是不能被消费的

这是因为保证消息消费的顺序性,即使前面的消息消费失败了,它也需要等待前面的消息处理完毕才能处理后面的消息

顺序消费模式下,并发消费和集群消费均支持重试消息

联系方式

关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。

你可能感兴趣的:(java,java-rocketmq,rocketmq)