消息重试|学习笔记

简介: 快速学习消息重试,消息重试。为什么会有消息重试机制?消息重试目的是保证消息一定会被消费掉。消息重试分为两个方面:一是对于顺序消息的重试;二是无序消息的重试。

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息重试】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12455


消息重试


内容介绍:

一、顺序消息重试

二、无序消息重试


一、顺序消息重试

顺序消息的重试:会被自动的触发,在消费顺序消息的时候,如果对MQ没有做出正常的反馈,允许重新消费这个消息。由于消息的消费是顺序的,所以当前面的消费者没有消费完消息的时候,后面的消费者是不能够消费的,需要保持严格的顺序。这种情况下会可能出现消息的消费者被阻塞。所以在使用顺序消费的时候,要及时的监控并处理消费失败的情况,检测出问题,避免阻塞现象的发生。以上是顺序消息重试的一种方式。


二、无序消息重试

无序消息的重试:哪些消息属于无序的消息?普通消息默认都是无序的,包括定时、延时、事务消息都是以无序的方式的消费的。无序的方式在进行消费的时候,如果消费失败需要设置不同的状态达到重试的结果。设置哪些状态能够进行消息的重试?无序消息的重试对于集群消费方式是有效的,对于广播的方式是失效的。也就是说如果当前的广播的方式,不管是成功消费还是消费失败,只能消费一次。所以无序消息的重试的机制都是针对集群消费方式。

image.png

首先看重试的次数。如果设置了返回消息失败了,最终MQ允许消费多少次呢?默认情况下最多允许消费16次。每一次的间隔也是不同的。例如第一次间隔了10秒,第二次间隔30秒,第三次间隔1分钟等依次类推。到第16次的重试的时候,就会间隔两个小时。

如果消息重试真正进行了16次,总的时间算下来应该是4小时46分钟。如果在这个过程中有某一次消费成功了,给MQ响应成功了,就不会再接着重试了。如果消费了16次花费了4小时46分钟依然没有消费成功,这个消息就会不再被投递了和消费了。这时这个消息就会进入死信队列。后面会讲解死信对列。以上就是重试次数的内容,默认次数是16次。

image.png

什么情况下会重置方式?当处理完业务之后,如果返回的状态是action.reconsumelater.这个的时候,就允许消费相同的消息。如果返回的是null,也就是什么都没有返回,那么MQ认为当前的这个消息没有消费成功,就会允许再次去消费。如果抛出的是异常runtimeexception,MQ也允许重新去消费消息。所以对于无序消息来说,在进行重试的时候以上三种情况都会触发重试的机制。上面已经说过重试16次。这16次能否进行修改?也是可以的。见下图:

image.png

在进行消费的时候,如果消费失败了,但是不想重试,也可以做。

在try{

Doconsumemessage(message);

}catch(throw able e){

有可能会发生异常。在catch当中,包括整个的外部都做action.commitmessage;这样MQ会认为当前的消息成功的消费了。

就不会继续重试了。以上就是消息重试的配置方式,主要是在Java代码中,如果出现上述的三种方式,都是可以重试的。如果不想重试就设置action.commitmessage就可以了。

设置的最大重试次数16次是可以修改的。如何修改?

如果修改的次数是小于等于16次,默认的就是走上面的配置。例如重试次数设置的是10,那么后面的11-16就不会再尝试了。时间间隔就是按照默认的方式进行处理。如果设置的重试次数大于16次,超过16次每一次间隔的时间都是每次2小时。

具体的设置:

Properties Properties=new Properties();

//配置对应group ID的最大消息重试次数为20次

Properties.put(propertkeyconst.maxconsumetimes,“20”);

Consumer consumer=ONfactory.createconsumer(Properties);

通过额外的属性去设置重试的次数。在创建消费者的时候传入Properties就可以了。

这里还有一个细节需要注意:当前给同一个消费者组当中设置了重试的次数,那么对所有组内其他的消费者都是起作用的。对一个设置了,组内其他的消费者都是起作用的。

如果只对相同Group ID下两个consumer实例中的其中一个设置了maxreconsumertimes,那么该配置对两个consumer实例均有效。

就是设置了一个maxreconsumertimes,组内配置的两个都会使用对应的设置。

设置会通过覆盖的方式生效,比如最后启动的实例会把之前启动的配置的实例覆盖。以上就是如何更改默认重试的次数,是可以超过16次的。

在消费时候,有时需要获取一下当前消息重试的次数。在message中有这样一个方法:getreconsumertimes,通过

Public class Message listener Impl implements Message Listener{

@override

public Action consume (Message message, Consume context context) {

//获取消息的重试次数

system.out.println(message.get Reconsume Times());

return Action. Commit Message;

会获得当前某一个消息已经重试的次数。

以上就是关于消息重试所讲的知识点。接下来做一个梳理。

首先分为两大块,第一是顺序消息的重试;顺序消息对于消费者消息

是由严格的顺序保障的。如果前面的消费者没有正常的消费的话,后面的消费者就会一直被阻塞。所有顺序消费需要额外的关注,随时的监控消息消费的情况,避免阻塞的发生。

无序消息的重试可以通过人为的在Java代码中触发。三种方式。

第一种是返回action reconsumerlater;第二种是返回一个null;第三种是如果出现异常都是允许重试的,总共允许重试16次。16次总共间隔4小时46分钟。这16次是可以改动的,可以在创建消费者的时候指定maxreconsumertimes的次数。入股次数小于等于16,每一次的间隔时间都是根据默认的方式而来的。如果大于16次,超过16次的间隔时间都是每次2小时。最后需要知道的是对于一个消费者进行重试次数的设置之后,组内的其他消费者都是适用的。这个消息消费重试它的配置是覆盖式的,后面会覆盖前面的。

在消费消息的同时也可以获得消息重试的次数。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 Apache RocketMQ
rocketmq客户端发送消息报错和超时问题
org.apache.rocketmq.remoting.exception.RemotingTimeoutException: wait response on the channel <10.0.21.69:10911> timeout, 1000(ms)、 closeChannel: close the connection to remote address
3439 1
rocketmq客户端发送消息报错和超时问题
|
9天前
|
消息中间件 存储 NoSQL
解决MQ下单消息重复消费幂等机制详解
【11月更文挑战第20天】在分布式系统中,消息队列(Message Queue, MQ)作为一种常用的中间件,用于在不同系统或服务之间异步传输消息。MQ的应用场景广泛,如订单处理、日志收集、系统解耦等。然而,MQ的使用也伴随着一些挑战,其中消息重复消费是一个常见问题。特别是在下单场景中,如果消息被重复消费,可能会导致订单被重复创建或处理,从而引发一系列业务问题。
41 6
ly~
|
1月前
|
消息中间件 存储 监控
如何查看 RocketMQ 消息的重试次数和时间间隔?
RocketMQ消息重试次数和时间间隔可通过查看消费者和Broker日志、使用管理控制台的监控页面和消息查询功能,或通过分析消费者代码和RocketMQ客户端库代码等方式获取。日志中常有消费失败重试的明确记录,控制台可监控消费情况推断重试状态,代码分析则适合技术用户深入了解。
ly~
175 3
|
消息中间件 存储 监控
自顶向下学习 RocketMQ(十):消息重投和消息重试
生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway 没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在 RocketMQ 中是无法避免的问题。消息重复在一般情况下不会发生,当出现消息量大、网络抖动,消息重复就会是大概率事件。另外,生产者主动重发、consumer 负载变化也会导致重复消息。
自顶向下学习 RocketMQ(十):消息重投和消息重试
ly~
|
1月前
|
消息中间件 存储 数据库连接
RocketMQ 消息的重试机制是怎样的?
RocketMQ的消息重试机制确保消息消费失败时能自动重试,直至成功。默认重试16次,时间间隔逐次翻倍,从10秒至数分钟不等。重试在同组内不同消费者间进行,由异常抛出或特定状态返回触发。支持自定义重试次数与时间间隔,建议合理配置避免无限重试,保障系统稳定性和性能。
ly~
840 2
|
1月前
|
消息中间件 存储 监控
RocketMQ消息重试机制解析!
RocketMQ消息重试机制解析!
RocketMQ消息重试机制解析!
|
5月前
|
消息中间件 Arthas 监控
消息队列 MQ产品使用合集之每次重置reconsumeTimes就无法达到死信阈值,重试次数是否就要应用方控制
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ产品使用合集之每次重置reconsumeTimes就无法达到死信阈值,重试次数是否就要应用方控制
|
消息中间件 Java
Springboot与RabbitMQ消息超时时间、队列消息超时时间
Springboot与RabbitMQ消息超时时间、队列消息超时时间
361 0
|
消息中间件 缓存 监控
Rocketmq并发和顺序消费的失败重试机制
Rocketmq并发和顺序消费的失败重试机制
|
消息中间件 存储 缓存
MQ 学习日志(五) 如何保证消息的幂等性
如何保证消息的幂等性 简述
112 0
MQ 学习日志(五) 如何保证消息的幂等性
下一篇
无影云桌面