在分布系统中,一个业务由多个服务合作完成,每个服务有自己的事务,多个事务需同时成功或失败,这样的事务称为分布式事务。
其中每个服务的事务叫分支事务,整个业务的统一事务叫全局事务。
分布式事务相关知识讲解
-
课程引入
- 分布式事务一直是微服务中的难点问题,此前企业缺乏统一解决方案,解决复杂。随着技术发展,有了一整套解决思路。
-
黑马商城下单业务分析
- 业务流程:以黑马商城下单业务为例,该业务包含创建订单、清理购物车和扣减库存三个核心步骤。
- 早期单体架构:早期为单体项目,所有数据库操作在一个service方法内的一个事务里,满足事务ACID特性。
- 微服务架构变化:如今业务拆分到不同微服务,各微服务有独立数据库,各自分开执行。
-
分布式事务问题剖析
- 业务执行流程及事务提交:订单服务先处理数据创建订单并保存到数据库,事务提交后远程调用购物车服务清理购物车,购物车服务访问数据库完成清理并提交事务,然后订单服务再调用库存服务(商品服务)扣减库存。
- 库存不足导致的不一致问题:假设商品服务中库存不足,扣减库存失败,但前两个服务已成功,事务一致性被破坏,ACID特性无法满足。
- 购物车服务无法感知库存异常:订单服务远程调用购物车和库存服务,库存服务异常时订单服务能感知,但购物车服务无法感知,因其业务在被调用完成后已提交事务,不会回滚。
-
不一致性验证
- 准备工作:通过浏览器登录捷克用户账号,展示其购物车中有三个商品(一个下架,两个可下单),准备将小白鞋库存改为不足来验证事务一致性,即购物车数据是否应回滚。
- 操作过程及结果:打开数据库连接客户端,将小白鞋库存从1万改为0使其库存不足,然后下单。
- 下单依次执行创建订单(插入数据)、
- 清理购物车(删除数据)、
- 扣减库存(失败)。
- 最终下单失败但购物车被清理,出现不一致现象。
-
分布式事务概念定义
- 在分布系统中,一个业务由多个服务合作完成,每个服务有自己的事务,多个事务需同时成功或失败,这样的事务称为分布式事务。其中每个服务的事务叫分支事务,整个业务的统一事务叫全局事务。
-
后续课程预告
- 分布式事务出现问题,下一课将讲解如何解决分布式事务。
Seata
- Seata简介
- 开源背景:Seata是2019年1月由蚂蚁金服和阿里巴巴共同开源的分支事务解决方案。
- 分布式事务问题及Seata解决思路
- 问题场景:以订单业务为例,下单涉及多个微服务,如订单操作、购物车清理、库存扣减等,可能出现部分成功部分失败的情况,导致分支事务间状态不一致。
- 问题原因:微服务相互独立,执行时不知对方状态,各自提交事务。
- 解决思路:引入事务协调者(TC),各微服务与之联系并报告状态,TC根据情况通知各服务提交或回滚,Seata基于此思路实现。
- Seata实现方式中的角色及功能
- 事务协调者(TC):维护全局和分支事务状态,协调各分支提交或回滚,各分支事务向其报告状态,独立于微服务。
- 事务管理器(TM)
- 定义事务范围:确定全局事务开始和结束时间,全局事务从请求进入方法开始,如订单业务中进入
create order
方法,到该方法执行完结束。 - 监控事务:通过引入Seata依赖监控方法运行,知晓全局事务开始和结束情况,但不了解分支事务内部状态。
- 定义事务范围:确定全局事务开始和结束时间,全局事务从请求进入方法开始,如订单业务中进入
- 资源管理器(RM)
- 管理分支事务状态:与TC交互,注册分支事务并报告执行结果(成功或失败),使分支与全局事务建立联系,TC借此知晓各分支结果。
- 注册与报告流程:事务开始调用分支时,RM向TC注册分支事务,告知所属分支,执行完后报告执行结果。
- 后续操作
- 搭建TC服务:TC独立于微服务之外,需搭建该服务。
- 微服务引入依赖与配置:在微服务中引入Seata依赖,Seata提供TM功能,同时需做简单配置,告知微服务联系TC的方式。