赞
踩
在消费中如果发生异常了,RabbitMQ会使用补偿机制(重试),如果消息没消费成功,会一直重复发送,直到消费成功为止。
我们以之前的P2P例子为例:
@Component
@RabbitListener(queues = "USER")
public class P2PUserConsumer {
@RabbitHandler
public void receive(String msg){
System.out.println("消费者消费的消息:" + msg);
// 抛出一个运行时异常,模仿消费异常
throw new RuntimeException();
}
}
运行项目,可以看到控制台一直报错
RabbitMQ一直在重试状态,消息一直没有被消费掉,可能在线上会导致消息堆积情况,某些情况就影响使用了。
重试机制确实是保证消息一定被消费掉,但在某些场景会不适用,重试会出现以下问题:
不适合重试:代码bug问题,并且有写操作,这个时候需要考虑到幂等。后台服务应该通过日志,后期通过定时器来补偿,或者手动补偿。
适合重试:大部分属于读取,如调用第三方接口、网络波动问题、暂时调用不了、网络连接等。
spring:
rabbitmq:
listener:
simple:
retry:
# 开启消费者重试机制(默认就是true,false则取消重试机制)
enabled: true
# 最大重试次数
max-attempts: 5
# 重试间距(单位:秒)
initial-interval: 2s
以上配置消息会重试5次,如果一直失败,RabbitMQ放弃消费了,需要后期配置死信队列(在下篇文章描述)
如何解决幂等性问题:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。