Spring Cloud Alibaba【认识分布式事物、分布式事务产生的场景、什么是两阶段提交、XA方案、Seata方案、业务说明、下载启动Seata服务】(十)

 

目录

分布式事物处理_认识分布式事物

分布式事物处理_分布式事务产生的场景

分布式事物解决方案_什么是两阶段提交

分布式事物解决方案_XA方案

分布式事物解决方案_Seata方案

Seata提供XA模式实现分布式事务_业务说明

Seata提供XA模式实现分布式事务_下载启动Seata服务


扫描二维码关注公众号,回复: 15813642 查看本文章

分布式事物处理_认识分布式事物

前言 

随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用,下图描述了单体应用向微服务的演变。

注意: 分布式系统会把一个应用系统拆分为可独立部署的多个服务, 因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务。 

假如没有分布式事务 

在一系列微服务系统当中,假如不存在分布式事务,会发生什么呢?让我们以互联网中常用的交易业务为例子:

 

解释: 上图中包含了库存和订单两个独立的微服务,每个微服务维护了自己的数据库。在交易系统的业务逻辑中,一个商品在下单之前需要先调用库存服务,进行扣除库存,再调用订单服务, 创建订单记录。 

正常情况下,两个数据库各自更新成功,两边数据维持着一致性。

 

但是,在非正常情况下,有可能库存的扣减完成了,随后的订单记录却因为某些原因插入失败。这个时候,两边数据就失去了应有的 一致性。 

 

问题: 这种时候需要要保证数据的一致性,单数据源的一致性靠单机事物来保证,多数据源的一致性就要靠分布式事物保证。 

什么是分布式事务 

指一次大的操作由不同的小操作组成的,这些小的操作分布在不同的服务器上,分布式事务需要保证这些小操作要么全部成功,要么全部失败。从本质上来说,分布式事务就是为了保证不同数据库的 数据一致性。

实时效果反馈

1.分布式事物主要作用是_____。

A 解决数据单点故障问题

B 保证不同数据库的数据一致性 

C 解决性能问题

D 以上都错误

分布式事物处理_分布式事务产生的场景

跨JVM进程 

当我们将单体项目拆分为分布式、微服务项目之后,各个服务之间 通过远程REST或者RPC调用来协同完成业务操作。

典型的场景: 商城系统中的订单微服务和库存微服务,用户在下单时会访问订单微服务,订单微服务在生成订单记录时,会调用库存微服 务来扣减库存。各个微服务是部署在不同的JVM进程中的,此时,就会产生因跨JVM进程而导致的分布式事务问题。 

跨数据库实例 

单体系统访问多个数据库实例,也就是跨数据源访问时会产生分布式事务。

 

典型的场景: 例如,我们的系统中的订单数据库和交易数据库是放在不同的数据库实例中,当用户发起退款时,会同时操作用户的订单数据库和交易数据库,在交易数据库中执行退款操作,在订单数据库中将订单的状态变更为已退款。由于数据分布在不同的数据库实例,需要通过不同的数据库连接会话来操作数据库中的数据,此时,就产生了分布式事务。 

多个服务数据库 

多个微服务访问同一个数据库。

典型场景: 例如,订单微服务和库存微服务访问同一个数据库也会产生分布式事务,原因是:多个微服务访问同一个数据库,本质上也是通过不同的数据库会话来操作数据库,此时就会产生分布式事务。 

 实时效果反馈

1.下列属于分布式事物产生场景的是_____。

A 跨JVM进程

B 跨数据库实例

C 多个服务数据库

D 以上都正确

分布式事物解决方案_什么是两阶段提交

两阶段提交又称2PC,2PC是一个非常经典的强一致、中心化的原子 提交协议。 这里所说的中心化是指协议中有两类节点:一个是中心化 协调者节点 (coordinator)和 N个参与者节点 (partcipant)。

两个阶段:第一阶段:投票阶段和第二阶段:提交/执行阶段。 

2pc例子 

A组织B、C和D三个人去爬山:如果所有人都同意去爬山,那么活动将举行;如果有一人不同意去爬山,那么活动将取消。

首先A将成为该活动的协调者,B、C和D将成为该活动的参与者。

 

具体流程:

阶段1:   

①A发邮件给B、C和D,提出下周三去爬山,问是否同意。 那么此时A需要等待B、C和D的邮件。   

②B、C和D分别查看自己的日程安排表。B、C发现自己在 当日没有活动安排,则发邮件告诉A它们同意下周三去爬山。由于某种原因, D白天没有查看邮件。那么此时A、B和C均需要 等待。到晚上的时候,D发现了A的邮件,然后查看日程安排, 发现周三当天已经有别的安排,那么D回复A说活动取消吧。

阶段2:   

①此时A收到了所有活动参与者的邮件,并且A发现D下周 三不能去爬山。那么A将发邮件通知B、C和D,下周三爬山活动取消。   

②此时B、C回复A“太可惜了”,D回复A“不好意思”。至此该事务终止。 

2PC阶段处理流程

 举例订单服务A,需要调用支付服务B去支付,支付成功则处理购物订单为待发货状态,否则就需要将购物订单处理为失败状态。

第一阶段:投票阶段

第一阶段分三步:

1、事物询问:协调者 向所有的 参与者 发送事务预处理请求,称之为Prepare,并开始等待各参 与者的响应。

2、执行本地事物:各个 参与者节点执行本地事务操作,但在执行完成后并不会真正提交数据库本 地事务,而是先向协调者报告说:“我这边可以处理了/我这边不能处理”。.

3、各个参与者向协调者反馈事物询问的响应:如果参与者成功执行了事务操作,那么就反馈给协 调者Yes响应,表示事务可以执行,如果没有参与者成功执行事务,那么就反馈给协调者No响应, 表示事务不可以执行。第一阶段执行完后,会有两种可能。1、所有都返回Yes. 2、有一个或 者多个返回No。 

第二阶段:提交/执行阶段(成功流程) 

成功条件 :所有参与者都返回Yes。

异常流程第二阶段也分为两步

发送回滚请求

协调者 向所有参与者节点发出 RoollBack 请求.

事务回滚

参与者 接收到RoollBack请求后,会回滚本地事务。 

2PC缺点 

1、性能问题

无论是在第一阶段的过程中,还是在第二阶段,所有的参与者资源和协调者资源都是被锁住的,只有当所有节点准备完毕,事务协调者才会通知进行全局提交,参与者进行本地事务提交后才会释放资源。这样的过程会比较漫长,对性能影响比较大。

2、单节点故障

由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处 于锁定事务资源的状态中,而无法继续完成事务操作。

实时效果反馈

1.下列属于分布式解决方案2PC缺点的是_____。

A 性能问题

B 单点故障问题

C 协调者宕机,参与者正常

D 以上都正确

2.两阶段提交又称2PC,2PC是一个非常经典的____。

A 中心化的原子提交协议

B 强一致提交协议

C 强一致、中心化的原子提交协议

D 以上都是错误 

分布式事物解决方案_XA方案

什么是DTP 

2PC的传统方案是在数据库层面实现的,如Oracle、MySQL都支持 2PC协议,为了统一标准减少行业内不必要的对接成本,需要制定 标准化的处理模型及接口标准,国际开放标准组织Open Group定义分布式事务处理模型DTP(Distributed Transaction Processing Reference Model)。

DTP模型定义角色 

1、AP(Application Program):即应用程序,可以理解为使用DTP分布式事务的程序。

2、RM(Resource Manager):即资源管理器,可以理解为事务的参与者,一般情况下是指一个数据库实例,通过资源管理器对该数据库进行控制,资源管理器控制着分支事务。

3、TM(Transaction Manager):事务管理器,负责协调和管理事务,事务管理器控制着全局事务,管理事务生命周期,并协调各个RM。全局事务是指分布式事务处理环境中,需要操作多个数据库共 同完成一个工作,这个工作即是一个全局事务。

 注意: DTP模型定义TM和RM之间通讯的接口规范叫XA,简单理解为数据库提供的2PC接口协议,基于数据库的XA协议来实现2PC又称为XA方案。

 

执行流程:

1、 应用程序持有用户库和积分库两个数据源。

2、应用程序通过TM通知用户库RM新增用户,同时通知积分库RM为该用户新增积分,RM此时并未提交事物,此时用户和积分资源锁定。

3、 TM收到回复,只要有一方失败则分别向其他RM发起回滚事物,回滚完毕,资源释放。 4、 TM收到执行回复,全部成功,此时向所有RM发起提交事物,提交完毕,资源锁释放。 

实时效果反馈

1.分布式事物中2PC的传统方案是在____层面实现。

A 应用层

B 服务层

C 数据库

D 以上都错误

2.下列不属于DTP模型角色的是____。

A AP

B CP 

C RM

D TM

分布式事物解决方案_Seata方案

Seata是什么 

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简 单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

 

Seata整体框架 

全局事务与分支事务的关系图

与传统2PC的模型类似,Seata定义了三个组件来协议分布式事务的处理过程 

具体流程: 

Transaction Coordinator(TC):事务协调器,它是独立的中间件,需要独立部署运行,它 维护全局事务的运行状态,接收TM指令发起全局事务的提交与回滚,负责与RM通信协调各个分支事务的提交或回滚。

Transaction Manager(TM):事务管理器,TM需要嵌入应用程序中工作,它负责开启一 个全局事务,并最终向TC发起全局提交或全局回滚的指令。

Resource Manager(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器 TC的指令,驱动分支(本地)事务的提交和回滚。

还拿新用户注册送积分举例Seata的分布式事务过程

 

执行流程 :

1、用户服务的TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID。

2、 用户服务的RM向TC注册分支事务,该分支事务在用户服务执行新增用户逻辑,并将其纳入 XID对应全局事务的管辖。

3、 用户服务执行分支事务,向用户表插入一条记录。

4、 逻辑执行到远程调用积分服务时(XID在微服务调用链路的上下文中传播)。积分服务的RM 向TC注册分支事务,该分支事务执行增加积分的逻辑,并将其纳入XID对应全局事务的管 辖。

5 、积分服务执行分支事务,向积分记录表插入一条记录,执行完毕后,返回用户服务。

6 、用户服务分支事务执行完毕。

7 、TM向TC发起针对XID的全局提交或回滚决议。

8 、TC调度XID下管辖的全部分支事务完成提交或回滚请求。 

Seata实现2PC与传统2PC的差别 

1、架构层次方面,传统2PC方案的RM实际上是在数据库层,RM本质上就是数据库自身,通过XA协议 实现,而Seata的RM是以jar包的形式作为中间件层部署在应用程序的这一侧的。

2、性能层面:两阶段提交方面,传统2PC无论第二阶段的决议是commit还是rollbcak,事务性资源的 锁都要保持到Phase2完成才释放。而Seata的做法是在Phase1就将本地事务提交,这样就可以省 去Phase2持锁的时间,整体提高效率。

实时效果反馈

1.下列属于XA方案的问题的是_____。

A 需要本地数据库支持XA协议

B 性能较差

C 单点故障问题

D 以上都正确

2. Seata主要解决____。

A XA模式

B TCC模式

C AT模式

D 一站式的分布式事物解决方案 

Seata提供XA模式实现分布式事务_业务说明

业务说明

本实例通过Seata中间件实现分布式事务,模拟两个账户的转账交易 过程。两个账户在两个不同的银行(张三在bank1、李四在 bank2),bank1和bank2是两个微服务。交易过程中,张三给李四 转账制定金额。上述交易步骤,要么一起成功,要么一起失败,必 须是一个整体性的事务。 

 

工程环境

 

创建数据库

bank1库,包含张三账户 

CREATE DATABASE /*!32312 IF NOT
EXISTS*/`bank1` /*!40100 DEFAULT CHARACTER
SET utf8 */;
USE `bank1`;
/*Table structure for table `account_info`
*/
DROP TABLE IF EXISTS `account_info`;
CREATE TABLE `account_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account_name` varchar(100) COLLATE
utf8_bin DEFAULT NULL COMMENT '户主姓名',
  `account_no` varchar(100) COLLATE utf8_bin
DEFAULT NULL COMMENT '银行卡号',
  `account_password` varchar(100) COLLATE
utf8_bin DEFAULT NULL COMMENT '帐户密码',
  `account_balance` double DEFAULT NULL
COMMENT '帐户余额',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT
CHARSET=utf8 COLLATE=utf8_bin
ROW_FORMAT=DYNAMIC;
/*Data for the table `account_info` */
insert  into
`account_info`(`id`,`account_name`,`account_
no`,`account_password`,`account_balance`)
values (2,'张三','1',NULL,1000);

bank2库,包含李四账户

CREATE DATABASE /*!32312 IF NOT
EXISTS*/`bank2` /*!40100 DEFAULT CHARACTER
SET utf8 */;
USE `bank2`;
/*Table structure for table `account_info`
*/
DROP TABLE IF EXISTS `account_info`;
CREATE TABLE `account_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account_name` varchar(100) COLLATE
utf8_bin DEFAULT NULL COMMENT '户主姓名',  
`account_no` varchar(100) COLLATE utf8_bin
DEFAULT NULL COMMENT '银行卡号',
  `account_password` varchar(100) COLLATE
utf8_bin DEFAULT NULL COMMENT '帐户密码',
  `account_balance` double DEFAULT NULL
COMMENT '帐户余额',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT
CHARSET=utf8 COLLATE=utf8_bin
ROW_FORMAT=DYNAMIC;
/*Data for the table `account_info` */
insert  into
`account_info`(`id`,`account_name`,`account_
no`,`account_password`,`account_balance`)
values (3,'李四的账户','2',NULL,0);

Seata提供XA模式实现分布式事务_下载启动Seata服务

下载seata服务器

下载地址 :https://github.com/seata/seata/releases 

 

解压并启动 

tar -zxvf seata-server-1.4.2.tar.gz -C /usr/local/
#后台运行
nohup sh seata-server.sh -p 9999 -h 192.168.66.100 -m file &> seata.log &

注意: 其中9999为服务端口号;file为启动模式,这里指seata服务将 采用文件的方式存储信息。

测试 

查看启动日志

cat seata.log

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131869146