3RabbitMq的幂等性、重试机制、分布式事务
1:如果消费者进行消费的时候出现失败,队列会进行重试机制
因为底层使用的rabbitListener aop 进行拦截,如果出现了异常自动实现补偿机制,该消息会存储到rabbitmq服务器进行存放,直到一直不抛出异常为准。
如果程序没有抛出异常,则进行提交 事务
2:进行修改重试机制---一般五秒 消费者
如果重试了五次还不行则放弃这个消息,重试间隔是3秒的时间
队列里面之前缓存的
MQ的重试机制需要注意的问题
程序代码 发生异常的消息 进行记录日志 ,然后定时救补 自动进行补偿,获取人工接口进行补偿
三:如何保证mq的消费者幂等性问题 重复消费问题
使用全局id判断是否是同一个
保证全局id唯一,如果消费过了,就不让他消费,在生产者进行头中携带唯一id
rabbitMq的应答模式:自动应答和手动应答【ack模式】
1:需要在消费者一端
重试机制默认是一直重试,如果我们设置了五次的话,我们不能直接给他丢了,而是放到死信队列里面去
五:RabbitMQ的死信队列
生产者投递到交换机 然后通过路由Key 投递到具体的队列中。
如果具体的队列中已经满了,如果生产者还要投递消息 会出现消息丢失问题, 队列已经满了会产生丢失数据问题,因为队列已经满了已经到了极限了,如何保证数据不丢失呢,可以设置过期时间,如果规定时间没有消费完 队列可以把他删除掉
也就是说当队列已经满了,或者已经补偿次数限制到了 然后就放到死信队列
六:RabbitMq解决分布式事务【Mq解决最终一致性问题】
手动重试 注意幂等性问题、
场景1:如果生产者投递消息到队列中,但是消费者消费消息失败了,用手动ack补偿机制,但是要注意幂等性问题,防止重复消费
场景2:如果生产者发送消息到mq服务器失败了呢,如何保证生产者发送消息到mq服务器成功
解决办法:使用生产者的重试机制进行发送消息,通过confirm机制(确认机制)
1:实现这个类
2:重写方法
生产者往MQ服务器端发送消息的时候采用应答机制,如果 ack 为true 为成功
发送失败,然后重新进行发送给服务器端
生产者补偿也是有最大的次数限制的,可以配置,超过限制就有问题了,如果超过限制了还不行,那只能做人工配置了
3:
4:开启生产者确认机制
场景三:生产者发送投递消息到队列中成功了,消费者也已经消费了,但是生产者出现异常 然后进行回滚了。
这个时候我们需要使用到补单机制 进行补单,如果出现异常了就是回滚了,然后补单队列进行补单,补单消费者进行消费