Seata,一个开源的分布式事务解决方案的框架,主旨是在微服务架构下提供高性能和简单易用的分布式事务服务,并且提供了AT、TCC、Saga和XA事务模式,提供了一站式的分布式事务解决方案,其中TCC和XA我之前的一片文章有写过:

分布式事务系列之入门_codain的博客-CSDN博客分布式事务系列之入门https://blog.csdn.net/qq_38377525/article/details/123159026分布式事务系列之常见解决方案_codain的博客-CSDN博客分布式事务系列之常见解决方案https://blog.csdn.net/qq_38377525/article/details/123203672那么我们讲一下AT和Saga这两种事务模式


1、AT模式

这个模式是Seata最主推的分布式事务解决方案,他是基于XA演变而来的一种分布式事务模式,所以同样的它分为三大模块,分别是TM、RM和TC,其中TM和RM是作为Seata的客户端与业务系统的集成,TC作为Seata的服务器独立部署,TM表示事务管理器,他负责向TC注册一个全局事务,并生成一个全局唯一的XID,在这个模式下,每个数据库被当做为一个RM,在业务层面通过JDBC标准的接口访问RM时,Seata会对所有请求进行拦截,每个本地事务进行提交时,RM都会向TC注册一个分支事务,模式如图:

看图说流程:

  • TM向TC注册全局事务,并生成全局唯一的XID
  • RM向TC注册分支事务,并将其纳入该XID对应的全局事务范围
  • RM向TC汇报资源的准备状态
  • TC汇总所有事务参与者的执行状态,决定分布式事务是全部回滚还是提交
  • TC通知所有RM提交/回滚事务

2、Saga模式

Saga模式又叫长事务解决方案,主要描述的是在没有两阶段提交的情况下如何解决分布式事务问题,核心思想是:把一个业务流程中的尝试无拆分为多个本地短事务,业务流程中的每个参与者都提交真实的提交给该本地短事务,当其中一个参与者事务执行失败,则通过补偿机制补偿前面已经成功的参与者,上图:

上图可以知道,Saga是由一系列的Tn组成,每个Tn都有对应的Cn补偿动作,补偿动作用于撤销Tn造成的数据变更结果,它和TCC相比,少了Try这个预留动作,每个Tn操作都真实的影响到数据库

按照Saga的工作模式,他有两种执行方式:

1、T1、T2、T3....,Tn:这种方式标识所有的事务都是正常执行的

2、 T1、T2、T3....,Tj,Cj....,C2,C1:这种表示在Tj这个事务出现了异常,会通过Cn补偿操作撤销之前所有成功的T

Saga还提供了以下两种补偿恢复方式:

1、向后恢复:就是上面提到的第二种工作模式,如果有任意一个事务执行失败了,就会把之前所有的执行全部撤销掉

2、向前恢复:就是不进行补偿,对失败的事务进行重试,这种方式比较适合事务必须要执行成功的场景

这两种补偿方式,其实都有可能出现失败的情况,实在不行的时候,就只能人工干预的去处理相关的操作和数据了

Saga的优劣势:

优势:优势是对比XA和TCC体现的,一阶段直接提交本地事务,没有锁等待,性能较高,在时间驱动的模式下,短事务可以异步执行,补偿机制的实现比较简单

缺点:它不提供原子和隔离性,尤其是隔离性的影响,对系统来说是比较大的

Saga的实现方式:

电商平台下单是一个典型的长事务场景(看下图),

根据Saga模式的说法,要先将长事务拆分成多个本地短事务,每个服务的本地事务按照执行顺序逐一提交,一旦有一个事务异常了,则会采用补偿的方式进行撤回,这一过程的实现就要提到Saga的协调模式了:


  • 事件/编排式:把Saga的决策和执行顺序逻辑分布到Saga的每一个参与者中,他们通过交换事件的方式来进行沟通

在基于事件的编排模式中,第一个服务执行完一个本地事务之后,会发送一个事件或者指令,这个指令会被多个服务监听,监听到指令的服务在执行本地事务并发布新指令,然后一直延续这种指令的触发模式,直到当前业务流程中最后一个服务的本地事务执行结束,才能说整个分布式事务执行完成

咱们简单说一下订单支付的问题来体验一下:

订单服务创建一个新订单,把订单状态设置为待支付,并发布一个创建订单的事件

库存服务监听到创建订单的事件后,会执行本地的库存冻结方法,如果执行成功了,就会发布一个库存冻结的事件

支付服务监听库存冻结的时间后,会执行账户扣减方法,并发布支付订单的事件

积分服务监听支付订单的事件之后,增加账户积分,并更新订单状态为支付成功

需要注意的是,上面的步骤中的所有事务,但凡有一个失败,就会全部回滚


  • 命令/协同式:把Saga的决策和执行顺序逻辑集中在一个Saga控制类中,它以命令/回复的方式与每项服务进行通信,告诉对应的服务需要执行哪些操作

需要定义一个Saga协调器,专门负责每个参与者该做什么,Saga协调器以命令/回复的方式与每项服务进行通信,咱们再结合电商案例去体会提下:

订单服务会先创建一个订单,然后创建一个订单Saga协调器,启动订单事务

Saga协调器会向库存服务发送冻结库存命令,库存服务通过上图中的Order Saga Reply Queue回复执行结果

然后协调器继续向支付服务发起账户扣款指令,支付服务通过Order Saga Reply Queue回复执行结果

最后协调器会向积分服务发起增减积分指令,积分服务同时也会返回执行结果

需要注意的是,订单协调器必须提前知道"创建订单"的所有流程,因为Seata是通过基于JSON的状态引擎来实现的,并且在任何一个环节失败了,它都会向每个参与者发送回滚事务的操作

Seata系列之入门相关推荐

  1. SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

    为什么80%的码农都做不了架构师?>>>    SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://proje ...

  2. 【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储

    目录 1. 系列文章 2. 项目描述及效果展示 3. 阅读本文需要掌握的知识 4. 源码 5. 运行程序 6. 技术交流 1. 系列文章 [IPFS + 区块链 系列] 入门篇 - IPFS环境配置 ...

  3. IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (中篇)-js-ipfs-api - 图片上传到IPFS以及下载

    目录 1. 项目效果图 2. 创建React项目 3. 完成UI逻辑 4. 安装ipfs-api 5. App.js导入IPFS 6. 实现上传图片到IPFS的Promise函数 7. 上传图片到IP ...

  4. IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (上篇)-js-ipfs-api

    目录 1. 内容简介 2. IPFS-HTTP效果图 3. 实现步骤 3.1 安装create-react-app 3.2 React项目创建 3.3 运行React项目 3.4 浏览项目 3.5 安 ...

  5. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  6. c# hdf5 写string_Pandas系列之入门篇——HDF5

    Python系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响,压缩效率越高,查询效率越低.pandas ...

  7. .NET 4 并行(多核)编程系列之一入门介绍

    .NET 4 并行(多核)编程系列之一入门介绍 本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:   1. 并行编程和多线程编程的区别. ...

  8. QCC514x-QCC304x(headset)系列(入门篇)之1.1-QCC3044之基本介绍

    <下一节> 查看本文全部文章请点击: QCC514x-QCC304x(Headset)系列从入门到精通开发教程目录 目录 1.架构 2.技术特性 3.技术参数 蓝牙 CPU DSP 语音服 ...

  9. Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...

最新文章

  1. GPT-2大战GPT-3:OpenAI内部的一场终极对决
  2. 小数向上_【实操技巧】社保计算方法:向上取整见分进角(上)
  3. Pyhton 单行、多行注释方法
  4. linux kvm安装win7,ubuntu14.04 使用kvm安装win7系统
  5. 微信JSSDK分享页面自定义当前链接最简单示例
  6. vue 固定div 滚动_vue.js-div滚动条隐藏但有滚动效果的实现方法
  7. Js中Number对象
  8. 后台弹框。刷新不提示确认VB或.NET
  9. mysql 提示ssl问题
  10. 鸿蒙电视投屏软件,鸿蒙打造 未来电视就这样!荣耀智慧屏PRO深度评测
  11. 2021 Mac系统升级后,按大小写键没反应了,切换大小写的灯不亮了
  12. vb可以开发用c语言,c语言和vb语言的区别是什么?_后端开发
  13. 矿山井口安检综合管理系统
  14. 一本书读懂大数据时代
  15. list.sort() 方法可以用函数作 key 的参数
  16. MATLAB参数估计 置信区间
  17. 达梦数据库linux安装
  18. MD5.js,前端MD5加密
  19. 鼠友题库每日百题(十)
  20. Charles4.0最新版破解

热门文章

  1. SQL 索引 index
  2. [文档].Actel – Actel HDL Coding Style Guide
  3. java的Map集合 详解Map集合
  4. java issue
  5. Python:使用爬虫获取世界大学学术排名存储到 Excel 并作可视化输出
  6. 蓝海创意云丨影视特效制作学习经验分享篇
  7. rx2700_AMD 锐龙 7 2700/RX580 8G主机4999
  8. 成在规划,赢在执行 ——项目管理思维与技能精要
  9. Reinforcement Leaning资料
  10. HTML5常用新特性