【微服务】7、分布式事务

在分布系统中,一个业务由多个服务合作完成,每个服务有自己的事务,多个事务需同时成功或失败,这样的事务称为分布式事务。

其中每个服务的事务叫分支事务,整个业务的统一事务叫全局事务。

分布式事务相关知识讲解

  1. 课程引入

    • 分布式事务一直是微服务中的难点问题,此前企业缺乏统一解决方案,解决复杂。随着技术发展,有了一整套解决思路。
  2. 黑马商城下单业务分析

    • 业务流程:以黑马商城下单业务为例,该业务包含创建订单、清理购物车和扣减库存三个核心步骤。
    • 早期单体架构:早期为单体项目,所有数据库操作在一个service方法内的一个事务里,满足事务ACID特性。
    • 微服务架构变化:如今业务拆分到不同微服务,各微服务有独立数据库,各自分开执行。
  3. 分布式事务问题剖析

    • 业务执行流程及事务提交:订单服务先处理数据创建订单并保存到数据库,事务提交后远程调用购物车服务清理购物车,购物车服务访问数据库完成清理并提交事务,然后订单服务再调用库存服务(商品服务)扣减库存。
    • 库存不足导致的不一致问题:假设商品服务中库存不足,扣减库存失败,但前两个服务已成功,事务一致性被破坏,ACID特性无法满足。
    • 购物车服务无法感知库存异常:订单服务远程调用购物车和库存服务,库存服务异常时订单服务能感知,但购物车服务无法感知,因其业务在被调用完成后已提交事务,不会回滚。
  4. 不一致性验证

    • 准备工作:通过浏览器登录捷克用户账号,展示其购物车中有三个商品(一个下架,两个可下单),准备将小白鞋库存改为不足来验证事务一致性,即购物车数据是否应回滚。
    • 操作过程及结果:打开数据库连接客户端,将小白鞋库存从1万改为0使其库存不足,然后下单。
    • 下单依次执行创建订单(插入数据)、
    • 清理购物车(删除数据)、
    • 扣减库存(失败)。
    • 最终下单失败但购物车被清理,出现不一致现象。
  5. 分布式事务概念定义

    • 在分布系统中,一个业务由多个服务合作完成,每个服务有自己的事务,多个事务需同时成功或失败,这样的事务称为分布式事务。其中每个服务的事务叫分支事务,整个业务的统一事务叫全局事务。
  6. 后续课程预告

    • 分布式事务出现问题,下一课将讲解如何解决分布式事务。

Seata

  1. Seata简介
    • 开源背景:Seata是2019年1月由蚂蚁金服和阿里巴巴共同开源的分支事务解决方案。
  1. 分布式事务问题及Seata解决思路
    • 问题场景:以订单业务为例,下单涉及多个微服务,如订单操作、购物车清理、库存扣减等,可能出现部分成功部分失败的情况,导致分支事务间状态不一致。
    • 问题原因:微服务相互独立,执行时不知对方状态,各自提交事务。
    • 解决思路:引入事务协调者(TC),各微服务与之联系并报告状态,TC根据情况通知各服务提交或回滚,Seata基于此思路实现。
  1. Seata实现方式中的角色及功能
    • 事务协调者(TC) :维护全局和分支事务状态,协调各分支提交或回滚,各分支事务向其报告状态,独立于微服务。
    • 事务管理器(TM)
      • 定义事务范围 :确定全局事务 开始和结束时间,全局事务从请求进入方法开始,如订单业务中进入create order方法,到该方法执行完结束。
      • 监控事务:通过引入Seata依赖监控方法运行,知晓全局事务开始和结束情况,但不了解分支事务内部状态。
    • 资源管理器(RM)
      • 管理分支事务状态:与TC交互,注册分支事务并报告执行结果(成功或失败),使分支与全局事务建立联系,TC借此知晓各分支结果。
      • 注册与报告流程:事务开始调用分支时,RM向TC注册分支事务,告知所属分支,执行完后报告执行结果。
  2. 后续操作
    • 搭建TC服务:TC独立于微服务之外,需搭建该服务。
    • 微服务引入依赖与配置:在微服务中引入Seata依赖,Seata提供TM功能,同时需做简单配置,告知微服务联系TC的方式。

相关推荐
艾希逐月1 小时前
分布式唯一 ID 生成方案
分布式
齐木卡卡西在敲代码5 小时前
kafka的pull的依据
分布式·kafka
lllsure5 小时前
RabbitMQ 基础
分布式·rabbitmq
Wgllss5 小时前
Kotlin 享元设计模式详解 和对象池及在内存优化中的几种案例和应用场景
android·架构·android jetpack
DN金猿9 小时前
rabbitmq发送的延迟消息时间过长就立即消费了
分布式·rabbitmq
程序员不迷路9 小时前
微服务学习
微服务·架构
fanly119 小时前
使用surging 常见的几个问题
微服务·surging
Sadsvit9 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos