消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)

经典案例:以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯。

RabbitMQ解决分布式事务原理: 采用最终一致性原理。

消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)

根据最终一致性,按派单流程提出问题,解决分布式事务:

1.怎么保证订单发送到了订单队列?

  • 答:采用确认机制,在生产者设置确认回调,如果不成功,则一直发送消息到消息队列。

2.怎么保证消费者一定消费了队列消息?

  • 答:使用补偿机制手动ACK模式,一直重试去保存(注意幂等性问题)。

3.订单如果发送到了消息队列,但是后面的代码出异常了,执行了回滚,前面的插入订单代码失效,怎么处理?

  • 答:见上图,有一个补单系统,生产者发送订单到队列的时候,同时发送了给补单系统,补单消费者接受到消息,会比对订单数据库和派单数据库,如果订单数据库内容和派单数据库内容不一致,则插入数据到订单系统。

4.如果第2步的消费者使用补偿机制还是失败了,怎么办?

  • 答:只能使用记录日志,定时健康检查,人工去补偿了。

5.如果第3步的补单消费者消费失败了,怎么办?

  • 答:一样使用记录日志,定时健康检查,人工去补偿了

通过以上的步骤可以完美的解决了分布式事务的问题了。