当前位置: 首页 > article >正文

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


http://www.kler.cn/a/472273.html

相关文章:

  • 【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名
  • 攻防世界 wtf.sh-150
  • SpringBoot插件
  • Docker Compose 启动 Harbor 并指定网络
  • Linux部署web项目【保姆级别详解,Ubuntu,mysql8.0,tomcat9,jdk8 附有图文】
  • 鸿蒙的APP真机调试以及发布
  • 第一个Spring MVC 6入门示例
  • 阿里云DDoS防护:如何更换IP地址,保护您的云服务器
  • 复习打卡大数据篇——HIVE 02
  • Wi-Fi Direct (P2P)原理及功能介绍
  • 运行.Net 7 Zr.Admin项目(后端)
  • Unity学习之UGUI(三)
  • Android图形系统中的PDF渲染:架构、JNI、系统定制与实际应用
  • 微服务-网关、配置热更新、动态路由
  • windows C#-接口中的索引器
  • CSS——17. nth-child选择器2
  • 镜舟科技2024年度回顾,坚持长期价值,进一步实现商业突破
  • 数据挖掘——数据预处理
  • 安徽省乡镇界面图层+arcgis数据shp格式-乡镇名称和编码2020年+wgs84坐标内容测评
  • 解锁RDMA 技术:从原理到应用的深度剖析
  • 不停机从 PostgreSQL 迁移到 MySQL
  • (k8s)k8s系列之命令手册速查
  • 单片机软件定时器V4.0
  • nacos学习笔记(一)
  • php函数性能优化中应注意哪些问题
  • 深度学习知识点:RNN