- 场景
在分布式场景中,如图所示: 如第3步报错,订单状态将会回滚到待支付状态,但是第二步不会回滚,依然会将消息推送到MQ(积分队列)中去,增加积分。 所以会导致,支付状态未更新成功,依然增加积分。
解决方案: 支付服务创建一个补偿队列,单独监听服务,比对订单状态,如果不一致,则更新订单状态。
补偿队列再挂,就用死信队列、定时任务......
- 基于MQ解决分布式事务原理:采用最终一致性原理
- 确保生产者一定将增加积分的消息投递到MQ中, 采用:确认机制。
- 确保消费者消费消息一定成功,如果没有异常情况下通知MQ删除该消息,否则情况下不断重试消费 。 采用:手动ack应答形式。
注意:重试过程中,需要注意消息幂等性问题。 - 如果MQ异步代码执行之后,代码出现异常的情况下,如何保证分布式事务问题。
采用:补偿队列