13.1 消息补偿机制介绍
RabbitMQ默认的补偿机制就是重试机制,当消费者程序报错时就会默认的去实现补偿机制,因为@RabbitListener底层使用的是AOP的异常通知进行拦截,自动实现补偿机制该消息会缓存到rabbitmq服务器端进行存放,一直重试到不报错。这样一直重试是有问题的,我们可以设置重试的间隔时间,当重试次数全部用完之后,消息就会被放弃掉。
13.2 YAML配置
spring:
rabbitmq:
host: 192.168.133.128
port: 5672
username: admin
password: admin
virtual-host: /
listener:
simple:
retry:
enabled: true # 开启消费者程序异常情况下会进行重试
max-attempts: 3 # 最大重试次数
initial-interval: 30000 # 重试间隔时间
server:
port: 8081
13.3 重试机制问题
13.3.1 超时异常
因为网络异常或者调用的第三方接口异常导致失败的是需要进行重试的。有时候因为网络延迟也会造成消息重复消费的问题。解决重复消费方案如下:
- 使用全局的MessageID判断消费方是同一个消息,在Message中塞入一个全局的标识符。
- 使用业务逻辑ID比如订单号
13.3.2 程序异常
因为程序异常导致失败的是不需要进行重试的,这个时候我们应该将异常日志进行记录并使用定时任务进行消息的补偿,实在不行那就进行人工的补偿。
本文暂时没有评论,来添加一个吧(●'◡'●)