集群与负载均衡系列(7)——消息队列之分布式事务

         XA协议:

               为了解决分布式事务,各大厂家数据库都提供了xa协议接口。什么是XA协议,就是通过多阶段提交,确保数据一致性。以两阶段提交为例

              集群与负载均衡系列(7)——消息队列之分布式事务

                   第一阶段为准备阶段,事务管理器会给每个资源管理器发送Prepare消息。每个资源管理器要么返回失败,要么写本地事务,redo和undo日志写好,但是不提交。

             第二阶段为提交阶段,如果事务管理器收到任何资源管理器的失败消息或者超时消息,会给每个资源管理器发送回滚消息。否则给每个资源管理器发送提交消息。

             优点:1、有比较成熟的第三方框架,比如atomikos。可以以数据源的形式整合到spring中。

                        2、sqlserver、oracle、mysql、db2都实现了该接口。

             缺点:1、对于高并发应用,性能不够理想。对于内网企业级应用是完全可以的。目前在内网中使用atmikos完全没问题。

                        2、不是所有数据库都实现了该接口,而且大部nosql都未实现该接口。

                        3、mysql主备切换时会导致数据不一致。


             TCC编程模式

                    该模式是这样的,try阶段操作本地事务对数据库A读写,成功则提交事务,失败则回滚。confirm阶段操作本地事务对数据库B读写,成功则提交事务,失败则进入cancel阶段。cancel阶段对数据库A做逆操作。

              优点:1、没有锁太多资源,效率可以。

              缺点:1、由于与业务耦合,不好复用。

                         2、需要注意整体的事务隔离问题。


              消息队列

                   比如之前提到的rabbitmq。思路是这样的,操作本地事务对数据库A读写,成功则提交事务,失败则回滚。事务提交成功后,发送可靠的消息到消息队列服务,消费端操作本地事务对数据库B读写,如果失败则回滚并重新入队。

             可以看出来,这里的关键就是可靠的消息,就是消息不能丢失,消费端必须成功消费。这就依赖于严格的测试,对于测试后漏网的bug来说,还有最后一道壁垒,就是在始终无法消费的时候发消息通知管理员,进行手动处理。

             对于如何发送可靠的消息,可以参看之前的文章集群与负载均衡系列(6)——消息队列之rabbitMQ+spring-boot+spring amqp发送可靠的消息

             优点:1、本来消息队列就是用来处理高并发的,性能不错。

                        2、可以做到与业务解耦。

             缺点:1、需要严格测试,保证各个环节的可靠性。

                        2、实现在三个方案里面最为复杂。

                        3、需要注意整体的事务隔离问题。


             综上:考虑到性能和复用方面,消息队列应该是最为理想的分布式事务解决方案。