经典案例:以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯。
RabbitMQ解决分布式事务原理: 采用最终一致性原理。
根据最终一致性,按派单流程提出问题,解决分布式事务:
1.怎么保证订单发送到了订单队列?
- 答:采用确认机制,在生产者设置确认回调,如果不成功,则一直发送消息到消息队列。
2.怎么保证消费者一定消费了队列消息?
- 答:使用补偿机制手动ACK模式,一直重试去保存(注意幂等性问题)。
3.订单如果发送到了消息队列,但是后面的代码出异常了,执行了回滚,前面的插入订单代码失效,怎么处理?
- 答:见上图,有一个补单系统,生产者发送订单到队列的时候,同时发送了给补单系统,补单消费者接受到消息,会比对订单数据库和派单数据库,如果订单数据库内容和派单数据库内容不一致,则插入数据到订单系统。
4.如果第2步的消费者使用补偿机制还是失败了,怎么办?
- 答:只能使用记录日志,定时健康检查,人工去补偿了。
5.如果第3步的补单消费者消费失败了,怎么办?
- 答:一样使用记录日志,定时健康检查,人工去补偿了
通过以上的步骤可以完美的解决了分布式事务的问题了。