前几天,有一位10多年经验的架构师在面试互联网大厂时被问到这样一个问题,说请你谈谈分布式事务的解决方案。那今天,我给大家分享一下我对这个问题的理解。
另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。
1、什么是分布式事务
分布式事务是指事务的参与者和支持事务的服务器、资源服务器以及事务管理器,分别位于分布式系统的不同节点上,保证不同数据的一致性。
比如大型电商系统中的下单场景,会涉及到扣库存、优惠折扣计算、订单ID生成等这些服务,通常情况下库存、折扣、订单ID生成的服务都位于不同的服务器和数据库中,那么下单是否成功,不仅取决于本地节点的数据库操作,还需要依赖其他服务的执行结果结果,这个时候分布式事务就是保证这些操作要么全部成功,要么全部失败。
因此,本质上来说,分布式事务就是为了保证不同数据库数据的一致性。
2、分布式事务解决方案
基于CAP定理和Base理论,我们可以知道,对于上述情况产生的分布式问题,我们要么采用强一致性方案,要么采用弱一致性方案。
所谓强一致性方案,是指通过第三方事务管理器来协调多个节点的事务性,保证每一个节点的事务达到同时成功或者同时失败,为了实现这样一个需求。我们可以引入X/Open DTP模型提供的XA协议,基于2阶段提交或者3阶段提交的方式去实现,但是如果全局事务管理器中的多个节点,任意一个节点在进行事务提交确认的时候,由于网络通信延迟导致了阻塞,就会影响到所有节点的事务提交,而这个阻塞过程呢,也会影响到用户的请求线程,这对于用户体验以及整体的性能影响非常大。
而弱一致性方案就是针对强一致性方案所衍生出来的性能和数据一致性平衡的一个方案。简单来说就是损失掉强一致性,数据在某一个时刻会存在不一致的状态,但是最终这些数据会达成一致,这样的好处是提升了系统的性能。在弱一致性方案中,常见的解决方案有3种:
第1个:使用分布式消息队列来实现最终的一致性。
第2个:基于TCC事务,通过演进版本的2阶段提交去实现最终一致性。
第3个:使用Seata事务框架,它提供了多种事务模型。比如说 AT、XA 、Saga、TCC等,不同的模型提供的是强一致性或者弱一致性的支持。