默认情况下如果有消息消费出错后会一直重试,造成消息堵塞
![](https://img.kancloud.cn/ca/2d/ca2d28651a62a19eda73087fb61a8018_732x71.png)
如图可观察**unacked**和**total**一直是1,但**deliver/get**飙升
消息堵塞之后也影响到后续消息的消费,时间越长越来越多的消息将无法及时消费处理。
如果是单条或极少量的消息有问题可通过多开节点`concurrency`将正常的消息消息掉,但如果较多则全部节点都将堵塞。
如果想遇到消息消费报错重试几次就舍弃,从而不影响后续消息的消费,如何实现呢?
~~~yaml
spring:
rabbitmq:
host: localhost
port: 5672
virtual-host: /
username: admin
password: admin
listener:
simple:
concurrency: 5
prefetch: 10
retry:
enabled: true # 允许消息消费失败的重试
max-attempts: 3 # 消息最多消费次数3次
initial-interval: 2000 # 消息多次消费的间隔2秒
~~~
以上配置允许消息消费失败后重试3次,每次间隔2秒,如果还是失败则直接舍弃掉本条消息。
重试可解决因非消息体本身处理问题产生的临时性的故障,而将处理失败的消息直接舍弃掉只是为其它消息正常处理的权益之计而以,将业务操作降到相对低的影响。