基于可靠消息服务的分布式事务,这种实现分布式事务的方式需要通过消息中间件来实现。常见的一个例子就是支付宝账户和余额宝账户之间转账,需要将操作放在同一个事务中处理。要借助消息队列来处理此问题,简单地讲, 就是在支付宝账户扣钱的同时发送一条让余额宝账户加钱的消息到消息队列,余额宝系统一旦接收到该消息就操作数据库在自己的账户中加钱。下面来介绍基于消息中间件来实现这种分布式事务。
在系统A处理任务A前,首先向消息中间件发送一条消息
消息中间件收到后将该条消息持久化,但并不投递。此时下游系统B仍然不知道该条消息的存在。
消息中间件持久化成功后,便向系统A返回一个确认应答;
系统A收到确认应答后,则可以开始处理任务A;
任务A处理完成后,向消息中间件发送Commit请求。该请求发送完成后,对系统A而言,该事务的处理过程就结束了,此时它可以处理别的任务了。
但commit消息可能会在传输途中丢失,从而消息中间件并不会向系统B投递这条消息,从而系统就会出现不一致性。这个问题由消息中间件的事务回查机制完成,下文会介绍。
消息中间件收到Commit指令后,便向系统B投递该消息,从而触发任务B的执行;
当任务B执行完成后,系统B向消息中间件返回一个确认应答,告诉消息中间件该消息已经成功消费,此时,这个分布式事务完成。