背景

目前系统都涉及分布式事务的问题,业界有许多解决方案,比如两段提交(XA),TCC,saga模型等。两段提交可以实现分布式强一致性事务,但是由于两个阶段都对于数据库锁操作,效率低下,且过程中如果出现网络等异常,会导致事务长期不能完成。无论是TCC,还是利用队列,其实都是把数据库的加锁等待操作,上移到了应用的层面,而数据库本身的操作可以直接提交,在应用层面进行重试,补偿等操作,达到最终的一致性。

利用队列实现异步场景下的分布式事务

方案一 事务消息(半消息)消息服务器回查

1.mq发送端发送事务消息(半消息)到mqserver,消息并不发送到mq消费方
2.mq发送端收到消息发送成功的通知
3.执行本地事务
4.mq客户端根据本地事务执行的情况,通知mqserver对半消息commit或者rollback
5.mq服务端定期对没有发出去的半消息到消息发送端回查,更新状态,根据状态来对半消息进行commit或者rollback

方案二 利用本地事务表控制消息发送

1.mq发送客户端在本地同时写入业务数据和消息数据,作为一个本地事务
2.mq发送端从本地库读入消息数据
3.mq把消息发送到mqserver
4.mqserver把发送成功消息通知mq发端
5.mq发送端删除本地库里的消息数据