1.RabbitMQ消息重试机制
- 消费者在消费消息的时候,如果消费者业务逻辑出现程序异常,这时候应该如何处理?
答案:使用消息重试机制。(springboot默认有消息重试机制)
1.1 如何合适选择重试机制
- 消费者获取到消息后,调用第三方接口,但接口暂时无法访问,是否需要重试? (需要重试机制)
- 消费者获取到消息后,抛出数据转换异常,是否需要重试?(不需要重试机制)需要发布进行解决。
1.2 如何实现重试机制
对于情况2,如果消费者代码抛出异常是需要发布新版本才能解决的问题,那么不需要重试,重试也无济于事。应该采用日志记录+定时任务job健康检查+人工进行补偿
2.解决幂等性
网络延迟传输中,消费出现异常或者是消费延迟消费,会造成MQ进行重试补偿,在重试过程中,可能会造成重复消费。
2.1 消费者如何保证消息幂等性,不被重复消费
- 使用全局MessageID判断消费方使用同一个,解决幂等性。
- 或者使用业务逻辑保证唯一(比如订单号码,保证一个订单号码只可能被插入一次数据库)
2.2 代码实现
2.2.1 生产者
2.2.2 消费者
2.2.3 配置文件
spring:
rabbitmq:
####连接地址
host: 127.0.0.1
####端口号
port: 5672
####账号
username: guest
####密码
password: guest
### 地址
virtual-host: /springbootfanout
listener:
simple:
retry:
####开启消费者重试
enabled: true
####最大重试次数
max-attempts: 5
####重试间隔次数
initial-interval: 3000
3.RabbitMQ签收模式配置
3.1 开启手动应答模式
spring:
rabbitmq:
listener:
simple:
####开启手动ack
acknowledge-mode: manual
3.2 消费者
/**
* 描述:签收模式演示
* @author: myx
* @date: 2019-05-01
* Copyright © 2019-grape. All rights reserved.
*/
@Component
public class AckEamilConsumer {
/**
* 消费者
* @param message
*/
@RabbitListener(queues &