一、Seata 简介

Seata 是 阿里巴巴2019年开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里内部一直扮演着分布式一致性中间件的角色,帮助阿里度过历年的双11,对各业务进行了有力的支撑。经过多年沉淀与积累,2019.1 Seata 正式宣布对外开源 。目前 Seata 1.0 已经 GA。

项目地址:https://github.com/seata/seata/

二、分布式事务场景

在介绍分布式事务下,下面我们先来了解一个常见应用场景,这个场景(类似慕课网购买付费课程)也是我后面要讲的分布式事务的解决方案的案例:

用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。而学生选课信息在学习中心数据库,由学习服务去维护学习中心数据库的信息。下图是系统结构图:

如何实现两个分布式服务(订单服务、学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求,这里的关键是如何保证两个分布式服务的事务的一致性。

​ 尝试解决上边的需求,在订单服务中远程调用选课接口,伪代码如下:

下面我们分析下这种解决方案的问题

  • 1.更新支付表状态为本地数据库操作。
  • 2.远程调用选课接口为网络远程调用请求
  • 3.为保存事务上边两步操作由spring控制事务,当遇到Exception异常则回滚本地数据库操作。

问题如下:

  • 1、如果更新支付表失败则抛出异常,不再执行远程调用,此设想没有问题。
  • 2、如果更新支付表成功,网络远程调用超时会拉长本地数据库事务时间,影响数据库性能。(远程调用非常耗时的哦)
  • 3、如果更新支付表成功,远程调用添加选课成功(选课数据库commit成功),最后更新支付表commit失败,此时出现操作不一致。

上面的问题就涉及到了分布式事务的控制

三、什么是分布式事务

1、什么是分布式系统

部署在不同结点上的系统通过网络交互来完成协同工作的系统,比如:充值加积分的业务,用户在充值系统向自己的账户充钱,在积分系统中自己积分相应的增加。充值系统和积分系统是两个不同的系统,一次充值加积分的业务就需要这两个系统协同工作来完成。

2、什么是事务

事务是指由一组操作组成的一个工作单元,这个工作单元具有原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

  • 原子性:执行单元中的操作要么全部执行成功,要么全部失败。如果有一部分成功一部分失败那么成功的操作要全部回滚到执行前的状态。
  • 一致性:执行一次事务会使用数据从一个正确的状态转换到另一个正确的状态,执行前后数据都是完整的。
  • 隔离性:在该事务执行的过程中,任何数据的改变只存在于该事务之中,对外界没有影响,事务与事务之间是完全的隔离的。只有事务提交后其它事务才可以查询到最新的数据。
  • 持久性:事务完成后对数据的改变会永久性的存储起来,即使发生断电宕机数据依然在。

3、什么是本地事务

本地事务就是用关系数据库来控制事务,关系数据库通常都具有ACID特性,传统的单体应用通常会将数据全部存储在一个数据库中,会借助关系数据库来完成事务控制。

4、什么是分布式事务

在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务。这里强调的是多个系统通过网络协同完成一个事务的过程,并不强调多个系统访问了不同的数据库,即使多个系统访问的是同一个数据库也是分布式事务。另外一种分布式事务的表现是,一个应用程序使用了多个数据源连接了不同的数据库,当一次事务需要操作多个数据源,此时也属于分布式事务,当系统作了数据库拆分后会出现此种情况。

四、分布式事务里的理论

1、CAP理论

1.1 CAP理论介绍

CAP理论是:分布式系统在设计时只能在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)中满足两种,无法兼顾三种。

  • 一致性(Consistency):服务A、B、C三个结点都存储了用户数据, 三个结点的数据需要保持同一时刻数据一致性。
  • 可用性(Availability):服务A、B、C三个结点,其中一个结点宕机不影响整个集群对外提供服务,如果只有服务A结点,当服务A宕机整个系统将无法提供服务,增加服务B、C是为了保证系统的可用性。
  • 分区容忍性(Partition Tolerance):分区容忍性就是允许系统通过网络协同工作,分区容忍性要解决由于网络分区导致数据的不完整及无法访问等问题。

1.2 分布式系统能否兼顾C、A、P?

在保证分区容忍性的前提下一致性和可用性无法兼顾,如果要提高系统的可用性就要增加多个结点,如果要保证数据的一致性就要实现每个结点的数据一致,结点越多可用性越好,但是数据一致性越差。所以,在进行分布式系统设计时,同时满足“一致性”、“可用性”和“分区容忍性”三者是几乎不可能的

1.3 CAP有哪些组合方式?

  • 1、CA:放弃分区容忍性,加强一致性和可用性,关系数据库按照CA进行设计。
  • 2、AP:放弃一致性,加强可用性和分区容忍性,追求最终一致性,很多NoSQL数据库按照AP进行设计。
  • 说明:这里放弃一致性是指放弃强一致性,强一致性就是写入成功立刻要查询出最新数据。追求最终一致性是指允许暂时的数据不一致,只要最终在用户接受的时间内数据 一致即可
  • 3、CP:放弃可用性,加强一致性和分区容忍性,一些强一致性要求的系统按CP进行设计,比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。

2、BASE理论

BASE理论是对CAP中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

  • Basically Available(基本可用)
  • Soft state(软状态)
  • Eventually consistent(最终一致性)

五、分布式事务的解决方案

1、两阶段提交协议(2PC)

 1)第一阶段:准备阶段(prepare)

协调者通知参与者准备提交订单,参与者开始投票。

协调者完成准备工作向协调者回应Yes。

 2)第二阶段:提交(commit)/回滚(rollback)阶段

协调者根据参与者的投票结果发起最终的提交指令。

如果有参与者没有准备好则发起回滚指令。

2、事务补偿(TCC)

TCC事务补偿是基于2PC实现的业务层事务控制方案,它是Try、Confirm和Cancel三个单词的首字母,含义如下:

1)Try 检查及预留业务资源完成提交事务前的检查,并预留好资源。

2)Confirm 确定执行业务操作

对try阶段预留的资源正式执行。

3)Cancel 取消执行业务操作

对try阶段预留的资源释放。

3、消息队列实现最终一致

本方案是将分布式事务拆分成多个本地事务来完成,并且由消息队列异步协调完成。

六、Seata分布式事务解决方案

Seata有3个基本组成部分:

  • 事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。
  • 事务管理器TM:定义全局事务的范围:开始全局事务,提交或回滚全局事务。
  • 资源管理器(RM):管理正在处理的分支事务的资源,与TC对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚。

Seata管理的分布式事务的典型生命周期:

  1. TM要求TC开始一项新的全局事务。TC生成代表全局事务的XID。
  2. XID通过微服务的调用链传播。
  3. RM将本地事务注册为XID到TC的相应全局事务的分支。
  4. TM要求TC提交或回退相应的XID全局事务。
  5. TC驱动XID的相应全局事务下的所有分支事务以完成分支提交或回滚。

参考更多Seata原理:http://seata.io/zh-cn/docs/overview/what-is-seata.html

分布式事务解决方案Seata相关推荐

  1. druid seata 配置_分布式事务解决方案——Seata使用

    在微服务开发过程中分布式事务一直是一个比较重要的问题,之前对于分布式事务的解决方法一般会通过MQ的最终一致性来解决,尤其是RocketMQ的事务消息,感兴趣的可以看Spring Boot整合Rocke ...

  2. seata 集群_【视频】 聊聊分布式事务解决方案seata

    什么seata Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务.在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布 ...

  3. 微服务分布式事务解决方案Seata

    文章目录 一.Seata是什么? 二.使用步骤 1.引入库 2.读入数据 总结 一.什么是Seata? Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用 的分布式事务服务.Sea ...

  4. 分布式事务解决方案Seata——AT模式详解

    需要了解分布式事务的同学可以关注我的专栏一起学习,欢迎沟通:分布式事务 阿里开源分布式事务一站式解决方案seata基础认识可参见:分布式事务2PC协议之--Seata方案基本认识 概述 在我的另一篇关 ...

  5. 分布式事务解决方案 - SpringCloud Alibaba Seata

    目录 github代码:GitHub - 18409489244/seata: 基于springcloud alibaba seata 的分布式事务demo 一.常见分布式事务解决方案 二.分布式事务 ...

  6. 使用Seata解决分布式事务以及Seata的安装、配置和使用

    目录 事务的介绍 什么是本地事务? 分布式事务 分布式事务解决方案之seata Seata介绍 Seata是什么 Seata的分布式事务解决方案 Seata的核心组件 AT模式的工作流程 一阶段 二阶 ...

  7. 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题

    大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...

  8. 阿里分布式事务框架Seata集成详情

    大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...

  9. Spring Boot之基于Dubbo和Seata的分布式事务解决方案

    转载自 Spring Boot之基于Dubbo和Seata的分布式事务解决方案 1. 分布式事务初探 一般来说,目前市面上的数据库都支持本地事务,也就是在你的应用程序中,在一个数据库连接下的操作,可以 ...

最新文章

  1. 清华「暗黑破坏神」夺超算世界冠军,暨南大学首次参赛就跻身前三 | ISC21
  2. R语言中的dnorm(),pnorm(),qnorm(),rnorm()的解释
  3. 学习《Building Applications with FME Objects》 之二 使用Sessions(会话)
  4. Marshal.ReleaseComObject
  5. python自动测试p-使用python+requests实现接口自动化测试
  6. php连接mysqli面向过程,PHP基础知识总结:MySQLi 面向过程
  7. mongodb-$type、limit、skip、sort方法、索引、聚合
  8. 安卓学习 之 ContentResolver内容提供者(七)
  9. (2.15)备份与还原--使用作业备份、清理过期备份、清理历史记录、事务日志是否备份过...
  10. 1499元被标149元,苹果官网产品出现Bug价后续:白高兴了!
  11. 孙鑫VC学习笔记:第十七讲 (四) 用邮槽实现进程间的通信
  12. Hi3519V101芯片介绍
  13. 学生成绩分析系统后端函数解释(Python)
  14. 欧姆龙PLC的FinsTCP协议
  15. 竖流式沉淀池集水槽设计计算_竖流沉淀池设计计算书.
  16. 四舍六入五成双(四舍六入奇偶效验)银行家算法
  17. 如果redis哨兵宕机了怎么办_Redis 主从复制架构中出现宕机怎么办?以及哨兵功能...
  18. Unable to determine the relationship represented by navigation ‘XXX‘ of type ‘XXX‘.
  19. C++函数的递归调用
  20. linux 误删nginx.conf文件恢复

热门文章

  1. /etc/sysconfig/目录详解
  2. VSLAM与VIO的3D建图,重定位与世界观综述
  3. 【嵌入式】STM32实现SPI双机通信的一些细节(2)片选总结
  4. Intel8086处理器使用NASM汇编语言实现操作系统15-段的定义section/vstart和align语法
  5. bezier曲面制作,SU技巧 | Bezier Surface(贝兹曲面)
  6. 多元(二元)函数极限的存在性问题
  7. C语言标识符之关键字,预处理标识符和用户标识符的区别和关系
  8. ubuntu保存退出
  9. jstack排查死锁问题
  10. LeetCode_575_分糖果