一、原理
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
二、解决方案
1、rabbitMq,例如微服务架构中,订单服务、账户服务,库存服务,当用户通过订单服务下单成功去调用账户服务扣减订单金额,当账户余额足够且扣减成功后通知库存服务发货并扣减库存。
在这个业务流程中,当用户下单完成事务提交后,通过rabbitMq将用户下单成功的消息投递给账户服务,账户
服务消费消息成功后,判断用户账户余额是否足够,如果足够,扣减用户账户余额,并投递消息给库存服务。
如果用户账户余额不足,就需要通知订单服务去回滚之前的下单数据,此时可以使用mq投递数据回滚消息给订
单服务,也可以直接回调订单服务的数据回滚接口。后面的账号服务到库存服务的业务流程也是同理,当然这个过程中要防止消息投递失败以及消息消费失败的问题。
2、rocketMQ其实与rabbitMq的设计类似,但是不同的是,RocketMq消息中间件把消息分为两个阶段:Prepared阶段和确认阶段。
Prepared阶段(预备阶段),该阶段主要发一个消息到rocketmq,但该消息只储存在commitlog中,但consumeQueue中不可见,也就是消费端(订阅端)无法看到此消息。
commit/rollback阶段(确认阶段),该阶段主要是把prepared消息保存到consumeQueue中,即让消费端可以看到此消息,也就是可以消费此消息。
3、TX-LCN分布式事务框架:目前github上比较火的分布式事务框架,主要用于springcloud和dubbo;TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务。