【微服务】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的方式。

相关推荐
这个DBA有点耶6 小时前
Merge还是Materialize?一文讲透MySQL 8.0 CTE底层的执行计划博弈与性能陷阱
数据库·mysql·架构
一条Go6 小时前
四个进程,一把锁:Alioth 的告警评测为什么不需要消息队列
后端·设计模式·架构
得物技术7 小时前
多 Agent 架构的三次反转:从中心调度到自驱协作|得物技术
程序员·架构·llm
Decay__9 小时前
19_MySQL 告警与自动化运维 —— 告警分级收敛 / Webhook / 定时巡检 / 脚本库
运维·数据库·sql·mysql·架构
迅翼SwiftWing9 小时前
编队系列(二)|固定翼如何依靠邻居信息保持队形?一致性控制、通信拓扑与分布式仿真实现,附仿真代码
分布式
ly76899 小时前
幂等消费者与重试副作用:Kafka 端点接入时的去重边界
分布式·kafka·linq·apache camel·幂等消费者·重试副作用·去重边界
qq_452396239 小时前
第三篇:《从 ZooKeeper 到 KRaft 的迁移实战:前置条件、三阶段流程与回滚策略》
分布式·zookeeper·云原生
JosieBook10 小时前
【鸿蒙PC GUI适配】chiaki-ng 移植的工程实践:Qt6/QML 与 ArkUI 的混合窗口架构
华为·架构·harmonyos
七牛云行业应用19 小时前
DeepSeek Super-agent 与 Grok Bot:开源 Agent 架构和聊天助手有何区别
人工智能·ai·架构·ai编程
天远Date Lab20 小时前
零信任架构实战:基于天远租凭分期报告构建自动化汽车以租代购免押风控网关
网络·人工智能·架构·自动化