精华内容
下载资源
问答
  • 分布式事务实战

    2020-06-03 15:50:44
    3.分布式事务实战讲解 1. 分布式事务讲解 1.1事务原理 在讲分布式事务之前,先聊一下事务。简单讲事务是数据库管理系统执行过程中的一个逻辑单元,它能保证要么一组数据库操作全部执行成功,要么全部失败,...

    文章结尾有彩蛋

    目录:

     

    1.分布式事务讲解

    2.分布式事务解决方案-servicecomb-pack

    3.分布式事务实战讲解

     

    1. 分布式事务讲解

     

    1.1事务原理

     

    在讲分布式事务之前,先聊一下事务。简单讲事务是数据库管理系统执行过程中的一个逻辑单元,它能保证要么一组数据库操作全部执行成功,要么全部失败,而做到这些的原理就是事务的ACID四大特性。

     

    • A. Atomic原子性的简称,事务作为一个整体来执行,要么全部成功,要么全部失败。

    • C. Consistency一致性的简称,事务应确保数据从一个一致的状态转变为另一个一致的状态。

    • I.  Isolation隔离性的简称,多个事务并发执行时,一个事务的执行不影响其他事务的执行。

    • D.Durability持久性的检查,已提交的事务修改数据会被持久保存。

     

     

    1.2传统单机数据库事务

     

    在传统单体应用架构中,我们的业务数据通常都是存储在一个数据库中的,应用中的各个模块对数据库直接进行操作。在这种场景中,事务是由数据库提供的基于ACID特性来保证的。

     

    例如,在一个用户购物下单的场景中,涉及到用户、订单、支付、库存等模块的一系列协同操作,如果其中一个模块出现问题,我们就可以通过数据库提供的事务特性来保证本次下单操作要么都成功,要么都失败。因为这些模块用的是同一个数据库,所处的是同一个事务管理器,不需要做额外的其他操作就能保证事务的特性。

     

     

    1.3微服务的分布式事务

     

    从广义上来讲,分布式事务其实也是事务,只是区别于单机事务不同之处是:由于业务上的定义和系统微服务架构的设计,很多大型的业务流程都被拆分成了多个单一的基础服务,而为了保证每个微服务都能独立进行开发和部署运行,通常都会采用一个微服务一个数据库的架构配套,然后将内部服务进行封装,以Rest api方式对外暴露。这样以往基于数据库来实现的数据操作,就变成了多个对外提供微服务的微服务系统之间的协同操作。在这种情况下,原有的单机事务方式已经不能够使用了,因为多个服务就意味着存在多个事务管理器和多个资源,单个微服务的本地事务管理器只能保证本地事务的ACID,为了在多个服务之间能保证业务的事务性,参与分布式事务的微服务通常会依托协调器来完成相关的一致性协调操作。

     

    那我们在微服务系统实际开发中,如何去实现协调器以处理分布式事务呢,这里的解决方案是采用华为提供的servicecomb-pack框架来解决这一问题。

     

     

    2. 分布式事务解决方案:

    servicecomb-pack

     

    2.1补偿方式

     

    在讲servicecomb-pack之前先了解两个概念:不完美补偿(saga)和完美补偿(tcc)。

     

    1. saga:不完美补偿,一般在系统中我们会专门为业务逻辑对应写一个补偿逻辑,如果业务逻辑执行失败,就会去执行这个补偿逻辑,我们称这个补偿逻辑为反向操作,这个反向操作同样会留下操作痕迹,例如:在银行系统中,客户去ATM取钱,银行会先对用户账户进行扣款操作,如果本次取钱不成功,银行系统会发出一笔冲正操作,将之前扣除的款项打回用户账户,这个冲正操作在交易记录里面是开源查询到的。

    2. tcc:完美补偿,cancel阶段会彻底清楚之前的业务逻辑操作,用户是感知不到的。例如:在一个交易平台去发起交易,首先在try阶段不会直接去扣除账户余额,而且去检查用户的额度并刷新额度,然后在confirm阶段才去真正操作账户。如果出现异常,那么在cancel阶段就需要去执行业务逻辑来取消try阶段产生的后果,释放在try阶段被占用的额度。整个过程只有等confirm执行完毕,交易才算完成。

       

    2.2servicecomb-pack

     

    servicecomb-pack出自于华为微服务框架servicecomb,是一个开源的分布式事务最终一致性解决方案,该项目已交由Apache软件基金会孵化,目前已经在apache毕业了。0.3.0版本之前叫servicecomb-saga,现版本已经改名为servicecomb-pack。

     

    servicecomb-pack架构主要包含两个组件:alpha和Omega

     

    • alpha:alpha其实就是一个server端,需要用户自行编译运行,它的作用就是上述中的分布式事务协调器,主要作用是和Omega客户端进行通讯,接收omega发过来的事务事件,然后进行持久化存储事务以及修改协调子事务的状态,从而保证全局事务中的所有子事务状态都一致,即要么全执行完成,要么全执行失败。

    • omega:Omega端其实可以看成是一个微服务中内嵌的agent,主要作用是监控本地子事务的执行情况并向alpha-server端发送子事务执行事件以及传递全局事务ID,并在异常情况下会根据alpha下发的操作事件进行相应的补偿操作。

     

     

    从上图中我们大致可以了解整个servicecomb-pack是如何运转的,但是有一个疑问点,alpha-server端是怎么知道多个Omega发送过来的子事务是属于同一个全局事务的呢?其实在分布式事务开始点会生成一个全局事务ID,然后在调用子事务所处的服务时,会把这个全局事务ID传递给子事务,然后alpha端会会把这个全局事务ID和Omega传递过来的子事务事件绑定并持久化到数据库中,这样就会形成一个完整的事务调用链,我们通过这个全局事务ID就可以完整的追踪到整个分布式事务的执行情况。

     

     

    Omega会以切面编程的方式向应用程序注入相关的处理模块,帮助我们构建分布式事务调用的上下文。Omega在事务处理初始阶段处理事务的相关准备的操作,在事务执行完毕做一些清理的操作,例如创建分布式事务起始事件,以及相关的子事件,根据事务的执行的成功或者失败生产相关的事务终止或者失败事件。这样带来的好处是用户的代码只需要添加几个annotation 来描述分布式事务执行范围,以及与本地的事务处理恢复的相关函数信息,Omega就能通过切面注入的代码能够追踪与本地事务的执行情况。Omega会将本地事务执行的情况以事件的方式通知给Alpha。由于单个Omega不可能知晓一个分布式事务下其他参与服务的执行情况, 这样就需要Alpha扮演一个十分重要的协调者的角色。Alpha将收集到的分布式事务事件信息整理汇总,通过分析这些事件之间的关系可以了解到分布式事务的执行情况, Alpha通过向Omega下发相关的执行指令由Omega执行相关提交或恢复操作,实现分布式事务的最终一致性。

     

    在了解的Pack实现的部分细节之后, 我们可以从下图进一步了解ServiceComb Pack架构下,Alpha与Omega内部各模块之间的关系图[1]。

     

     

    整个架构分为三个部分,一个是Alpha协调器,另外一个就是注入到微服务实例中的Omega,以及Alpha与Omega之间的交互协议, 目前ServiceComb Pack支持Saga 以及TCC两种分布式事务协调协议实现。

     

    Omega包含了与分析用户分布式事务逻辑相关的事务注解模块(Transaction Annotation)以及事务拦截器(Transaction Interceptor);分布式事务执行相关的事务上下文(Transaction Context),事务回调(Transaction Callback) ,事务执行器(Transaction Executor);以及负责与Alpha进行通讯的事务传输(Transaction Transport)模块。

     

    • 事务注解模块是分布式事务的用户界面,用户将这些标注添加到自己的业务代码之上用以描述与分布式事务相关的信息,这样Omega就可以按照分布式事务的协调要求进行相关的处理。如果大家扩展自己的分布式事务,也可以通过定义自己的事务标注来实现。

    • 事务拦截器这个模块我们可以借助AOP手段,在用户标注的代码基础上添加相关的拦截代码,获取到与分布式事务以及本地事务执行相关的信息,并借助事务传输模块与Alpha进行通讯传递事件。

    • 事务上下文为Omega内部提供了一个传递事务调用信息的一个手段,借助前面提到的全局事务ID以及本地事务ID的对应关系,Alpha可以很容易检索到与一个分布式事务相关的所有本地事务事件信息。

    • 事务执行器主要是为了处理事务调用超时设计的模块。由于Alpha与Omega之间的连接有可能不可靠,Alpha端很难判断Omega本地事务执行超时是由Alpha与Omega直接的网络引起的还是Omega自身调用的问题,因此设计了事务执行器来监控Omega的本地的执行情况,简化Omega的超时操作。目前Omega的缺省实现是直接调用事务方法,由Alpha的后台服务通过扫描事件表的方式来确定事务执行时间是否超时。

    • 事务回调在Omega与Alpha建立连接的时候就会向Alpha进行注册,当Alpha需要进行相关的协调操作的时候,会直接调用Omega注册的回调方法进行通信。由于微服务实例在云化场景启停会很频繁,我们不能假设Alpha一直能找到原有注册上的事务回调, 因此我们建议微服务实例是无状态的,这样Alpha只需要根据服务名就能找到对应的Omega进行通信。

    • 事务传输模块负责Omega与Alpha之间的通讯,在具体的实现过程中,Pack通过定义相关的Grpc描述接口文件定义了TCC 以及Saga的事务交互方法, 同时也定义了与交互相关的事件[2]。 

     

    3. 分布式事务实战

     

    如何在项目中运用servicecomb-pack,需要进行以下步骤:

     

    3.1 alpha-server配置

     

    3.1.1编译alpha-server

     

    1. 环境准备

     

    • JDK1.8

    • Maven3.x

     

    2. 源码获取

     

    Github地址:https://github.com/apache/servicecomb-pack

    $ git clone:https://github.com/apache/servicecomb-pack.git

    $ git checkout 0.4.0

     

    3. 修改配置文件

     

    找到alpha-server/src/main/resource/application.yaml,修改datasource信息为本地信息即可

     

    4. 本地构建alpha-server

     

    $ cd servicecomb-pack

    $ mvn clean install -DskipTests -Pspring-boot-2

    在执行完命令后,可在alpha/alpha-server/target/saga/alpha-server-${version}-exec.jar中找到alpha-server的可执行jar包

     

    5. 初始化数据库

     

    可在alpha\alpha-server\src\main\resources目录下找到schema-mysql.sql和schema-postgresql.sql两个sql文件,可自行根据所选数据库进行初始化即可。

     

    6. 启动alpha-server

     

    java -Dspring.profiles.active=prd -D"spring.datasource.url=jdbc:postgresql://${host_address}:5432/saga?useSSL=false" -jar alpha-server-${saga_version}-exec.jar

     

    *注意:请在执行命令前将${saga_version}和${host_address}更改为实际值

     

    至此,alpha-server全局事务管理器已经启动成功。

     

    3.1.2替换postgresql为mysql

     

    目前alpha-server支持pg和mysql两种数据库,默认为pg,如需改为mysql,需要进行如下操作:

     

    1. 安装并运行mysql

     

    2. 修改pom文件,添加依赖

     

    alpha-server/pom.xml,添加mysql依赖

    •  
    •  
    •  
    •  
    •  
    •  
    dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <scope>runtime</scope>  <version>8.0.15</version></dependency>

     

    3. 修改配置文件

     

    找到alpha-server/src/main/resource/application.yaml,修改datasource信息为本地信息即可

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    spring:  profiles: mysql  datasource:    username: ${username}    password: ${password}    url: jdbc:mysql://${host_address}:${port}/${database_name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false    platform: mysql    continue-on-error: false    driver-class-name: com.mysql.cj.jdbc.Driver

    (左右滑动查看全部代码)

     

    *注意:${username},${password},${host_address},${port},${database_name}需替换为实际值

     

    4. 本地构建alpha-server(和上面步骤一致)

     

    5. 启动alpha-server

     

    •  
    java -Dspring.profiles.active=mysql -Dloader.path=./plugins -D"spring.datasource.url=jdbc:mysql://${host_address}:3306/${database_name}? serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false " -jar alpha-server-${saga_version}-exec.jar

    (左右滑动查看全部代码)

     

    *注意:请在执行命令前将${saga_version}和${host_address}更改为实际值

     

    至此,alpha-server端已经配置编译完成。

     

    3.2 Omega配置

     

    配置完alpha-server之后,就相当于分布式事务的协调器已经配置完成,剩下的就是omega的配置,也就是在实际开发中如何运用servicecomb-pack去处理分布式事务。本次讲解会结合一个实际案例:购物系统中的下单流程和删除产品流程来分别讲解saga模式和tcc模式如何使用的。

     

    3.2.1 环境准备

     

    本次案例:购物系统是采用分布式微服务架构,整体分为三个微服务应用:orderManage订单管理应用、productManage产品管理应用、stockManage库存管理应用

     

     

    1. 添加依赖

     

    分别在三个应用的pom文件中添加Omega所需的依赖:

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    <dependency>    <groupId>org.apache.servicecomb.pack</groupId>    <artifactId>omega-spring-starter</artifactId>    <version>${servicecomb-pack.version}</version></dependency><dependency>    <groupId>org.apache.servicecomb.pack</groupId>    <artifactId>omega-transport-resttemplate</artifactId>    <version>${servicecomb-pack.version}</version></dependency><!--非必需 --><dependency>    <groupId>org.apache.servicecomb.pack</groupId>    <artifactId>omega-spring-cloud-consul-starter</artifactId>    <version>${servicecomb-pack.version}</version></dependency><dependency>    <groupId>org.apache.servicecomb.pack</groupId>    <artifactId>omega-spring-cloud-eureka-starter</artifactId>    <version>${servicecomb-pack.version}</version></dependency>

    (左右滑动查看全部代码)

     

    *注意:请将${servicecomb-pack.version}更改为实际的版本号(推荐版本为0.4.0)

    *注意:如需做集群,omega-spring-cloud-consul-starter和omega-spring-cloud-eureka-starter二选一,视项目的注册中心而定。

     

    2. 修改配置文件

     

    分别在三个应用的application.yml配置文件中添加alpha-server配置,具体配置如下:

    •  
    •  
    •  
    •  
    •  
    •  
    #配置alpha-server地址alpha:  cluster:    address: 10.15.15.172:8080omega:  enabled: true

    (左右滑动查看全部代码)

     

    注意:application.name一定不要过长,因为instanceId的格式是application.name+IP,并且长度为36,否则alpha-server事务持久化会报错

     

    以上两个属性配置为必填,因为alpha-server会依据application.name去查找对应的Omega,其他应用配置自行添加,address可根据alpha-server中的配置实际添加

     

    至此,环境准备已经完毕,下面开始进行应用代码编写。

     

    3.2.2 saga模式代码编写

     

    在本次案例中,我们以一个下单流程来讲解saga模式下代码是如何编写的。下单流程包括:点击下单、查询库存、支付、更新库存;订单应用作为起始服务,调用库存应用和产品应用,这两个应用对应的服务作为参与服务(子事务),在订单应用下单,订单应用使用rest template向产品应用发起调用校验产品库存,然后订单应用向库存应用发起支付请求(子事务1),支付成功后订单应用再向库存应用发起请求更新库存(子事务2)。

     

     

    1. @SagaStart

     

    首先需要在应用代码中描述出saga事务的边界,作为分布式事务的起始点,因此我们需要在订单应用中的createOrder()方法上添加该注解@SagaStart:

     

    2. @ Compensable

     

    @Compensable所代表的是本地子事务,因此需要在创建支付和更新库存的方法上添加此注解来标注该逻辑为子事务,并且在Compensable的compensationMethod属性中描述补偿方法。注意补偿方法和本地事务方法的参数必须一致,否则Omega在系统启动进行参数检查的时候报找不到恢复方法的错误。

     

    支付:

     

    支付对应补偿方法:

     

    更新库存:

     

    更新库存补偿方法:

     

    *注意:实现的服务和补偿方法必须满足幂等的要求

    *注意:默认情况下,超时需要显示声明

    *注意:若全局事务起点与子事务重合,需同时声明@SagaStart和@Compensable注解

    *注意:补偿方法的入参必须与try方法入参一致,否则启动时会报错(alpha-server找不到补偿方法)

     

    3.2.3 tcc模式代码编写

     

    下面我们会以删除库存流程来讲解tcc模式是如何编写代码的。删除库存流程:由产品应用发起(分布式事务起始),调用库存应用删除对应产品的库存信息(tcc子事务)。

     

     

    本次调用使用的是feign的方式,因此需要在产品应用中的pom文件添加相应的依赖:

     

     

    1. @TccStart

     

    我们以产品应用中的delete方法作为分布式事务起始点,因此在该方法上添加注解@TccStart:

     

    2. @ Participate

     

    在子事务所处的方法上添加该注解,并通过confirmMethod 以及cancelMethod属性定义相关确认以及取消方法名。这里需要注意的是这里提到的confirm,cancel方法的参数必须和try方法的相同。

     

    Confirm逻辑:

     

    Cancel逻辑:

     

    *注意:confirm和cancel方法的入参必须和try方法一致

    *注意:目前tcc模式还不支持timeout

     

    3.2.4事件信息获取

     

    默认情况下,8080端口用来处理Omega处发起的grpc请求,用来做事务上下文等操作;而8090端口则用于处理查询alpha处的事件信息。

     

    1. saga-事件信息查询api

     

    统计所有事件状态:

    http://${alpha-server.address:port}/saga/stats

    统计最近事件状态:

    http://${alpha-server.address:port}/saga/recent

    根据事件状态查询事件列表:

    http://${alpha-server.address:port}/saga/transactions

    根据服务名称查询对应的分布式事件列表:

    http://${alpha-server.address:port}/saga/findTransactions

     

    2. tcc-事件信息查询api

     

    Tcc目前没有提供正式的查询接口。但是有测试接口,在AlphaTccEventController中,可自行根据测试接口修改源码,重新编译即可。

     

    目前alpha-server提供的事件查询api不多,若有其他需求,用户可自行编写接口对数据库进行查询。

     

    本文所有观点都出自个人见解,疏漏、错误之处在所难免,欢迎大家指正,希望能够与大家一起交流和进步。

     

    [1]引用自:

    http://servicecomb.apache.org/cn/docs/distributed-transaction-of-services-1/

    [2]引用自:

    http://servicecomb.apache.org/cn/docs/distributed-transaction-of-services-1/

     

    精选提问:

     

    问1:TCC实现的是强一致事务么?

     

    答:可以这么理解,tcc分为三个步骤try、confirm、cancel,每个子事务都需要实现这三个步骤。Try部分完成业务的准备工作,confirm部分完成业务的提交,cancel部分完成事务的回滚,只有confirm阶段完成才算整个事务的完成。

     

    问2:全局事务起点与子事务重合这个怎么理解?

     

    答:就是比如一个业务方法即是事务的起点,也属于这个分布式事务内的一个子事务。这种情况下就需要同时声明@SagaStart 和 @Compensable 的注解或者@TccStart和@Participate 注解。

     

    问3:cancel操作是怎么做到的?是通过undo log做的,还是通过补偿语句呢?

     

    答:不管是saga模式还是tcc模式下的cance补偿逻辑,都是由alpha-server协调器进行下发指令给omega端;omega端再通过子事务注解内声明的cancel方法去找到对应的补偿方法,然后执行补偿方法内的逻辑。这个逻辑肯定是由自己根据当前的业务逻辑去实现的,比如扣库存,一般就是把扣除的库存加回去之类的操作。具体底层实现可以参见源码中的“GrpcCompensateStreamObserver”类。

     

    spring cloud分布式事务从入门到精通

    (如下载连接失效,请私信我)

    百度云下载链接:https://pan.baidu.com/s/1EtYyj7MEBqIGSYg2ljBFyg 提取码:n8p7

    备份下载地址 https://huoyan-dabing.lanzous.com/b0d253o4h 密码:9sem
     

    展开全文
  • 本资源是微服务分布式事务实战博客文章(10篇)的相关资源包,包括文章中的提到的sql,微服务和服务器
  • 分布式事务实战方案汇总

    千次阅读 2021-03-01 13:12:22
    分布式事务实战方案汇总

    1. 最终一致性

    1.1 本地事务表 + 轮询补偿

    交互流程

    在这里插入图片描述

    • commit DB事务提交阶段 本地客户端向DB进行事务提交,此时需要将业务数据和记录消息事务状态的信息表同时实现本地事务,此时标记消息事务状态为UN_SEND未发送或未完成状态,此时MQ未发送
    • ack DB确认阶段 返回DB事务提交成功或失败状态
    • commit MQ事务提交阶段 客户端发起MQ发送请求
    • update 本地事务表更新阶段 根据MQ发送结果进行本地消息事务表状态更新,成功则更新为SEND发送成功或发送完毕
    • MQ补偿 本地消息事务表定时轮询 对未发送成功消息事务进行补偿发送,实现分布式事务的最终一致

    场景:重构业务新老系统双写库同步

    在这里插入图片描述

    项目背景

    这是一个重构系统新老系统同时服役切量迁移的业务场景,老系统正在线上服役为各业务方提供接口查询功能,新系统重构完成后需要对接接入,调用流量要陆续从老系统切换到新系统,最终老系统迭代下线。

    分布式事务

    需要解决的分布式事务问题就是,双系统的数据是异构、分散的,线上不可停量,需要陆续切换完成,因此需要事先将老库存量数据洗入新库,此过程中增量数据写入是存在的,但是最终新老库是相对一致和统一的,该场景需要解决的是数据双库的双写问题

    设计方案

    系统写操作读操作调用方
    老系统异步写(MQ)读(冗余查)历史存量渠道
    新系统同步写新业务渠道/历史存量切换渠道

    场景Q&A

    • Q:如何保证双库双写?

      A: 同步写辛库,MQ异步写老库

      • 本地事务 + 消息事务表
        业务数据持久化开启数据库本地事务,该事务中记录业务数据同步状态信息
      • 确保本地事务一定成功,不保证异步MQ事务
        数据库事务成功后再发送写老库的MQ,保证本地事务一定完成才会触发MQ发送,这样确保本地事务一定成功,MQ可能成功也可能失败
      • 重试MQ事务状态,最终一致
        如果MQ事务失败,通过定时任务轮询进行重发驱动,最终一致
    • Q:异步MQ写,延迟问题如何解决?

      A: 增加冗余查询
      增加冗余对另一库的冗余查询进行Double Check。由于调用方几乎不可能同时使用新老系统做业务,因此延迟时间取决于MQ异步消费写的速度,如果场景比较复杂要确保绝对一致可以增加该处理方式

    • Q:双写过程中多个MQ如何保证顺序、防重等问题?

      A: 业务时间 + 业务ID

      • (1)同一个业务ID代表一个同一笔业务,可以依此进行业务防重处理
      消息业务ID业务时间消费时间处理逻辑
      IDTT执行
      IDTT+1防重不处理
      • (2)同一个业务ID的基础上增加业务时间,可以依此保证业务数据的实时刷新

      业务时间、消费时间同序

      消息业务ID业务时间消费时间处理逻辑
      IDTT执行
      IDT+1T+1执行(覆盖)

      业务时间、消费时间乱序

      消息业务ID业务时间消费时间处理逻辑
      IDTT+1抛弃(业务时间较早)
      IDT+1T执行
      • (3)不同业务ID的基础上增加业务时间,可以依此保证不同业务数据的按照业务时间刷新
      消息业务ID业务时间消费时间处理逻辑
      IDT+1T+1执行(业务时间较新)
      ID+XTT抛弃(业务时间较早)

    场景:第三方认证核验

    在这里插入图片描述

    项目背景

    这是一个认证系统以来外部核验系统进行用户身份鉴权的场景,即认证系统记录认证发起记录,并请求到外部的核验系统发起一笔核验请求,用户在核验系统确认后核验结果返回到认证系统确认用户的真实数据状态。

    分布式事务

    该流程中认证系统是一个本地系统,存放用户发起的认证流水信息和核验状态,依赖外部核验系统返回该笔认证记录的核验状态,由于核验过程是异步的,用户可以选择任意时间完成或者永远不完成,需要保证每次认证流程只有一笔业务发起,而且需要根据业务时间进行核验流程的超时进行强制取消或者补偿查询对齐核验状态等,需要解决的分布式事务是认证流水、核验结果的一致性

    设计方案

    数据系统事务正向事务逆向事务
    认证流水数据本地系统本地事务本地事务2PC保证定时任务,超时关闭流程
    核验状态数据外部系统分布式事务联同本地事务提交 / 定时任务驱动补偿提交外部系统控制
    • 正向流程
    1.发起认证
    2.1持久化认证记录
    2.2 发起核验请求
    补偿核验结果
    3. 变更核验状态
    4.核验成功
    开始
    认证系统
    认证流水表
    核验状态
    核验系统
    定时任务
    结束
    • 补偿流程
    1.轮询认证流水
    2.补偿查询核验状态
    3. 返回核验结果
    4.变更认证流水及核验状态
    定时任务
    营销系统
    核验系统
    认证流水表
    核验状态
    结束

    场景Q&A

    • Q:本地事务认证流水成功了,外部核验系统提交失败了怎么办?

      A:通过定时任务补偿触发二次提交,只要外部事物提交一直处于未成功,便一直会被重试提交,直到成功

    • Q:外部核验系统事务完成了,本地事务认证流水提前被作废了怎么办?

      A:以本地事务认证流水的结果为准。本地事务是通过定时任务进行补充提交+外部事务状态核验查询的,即时在临界点外部事务完成了,但是超过了业务处理时间已经关闭,不会再补充修改,这也是根据业务场景做的取舍,用户可以再次发起新流程进行核验

    1.2 本地事务表 + 事务消息

    交互流程

    在这里插入图片描述

    • prepare 准备阶段 本地客户端向DB、MQ发送prepare请求
    • ack 准备确认阶段 DB、MQ作为事务参与者返回本地客户端ack确认
    • commit/rollback 提交/回滚阶段 根据事务参与者在准备确认阶段返回结果进行事务提交或回滚,此时一旦有事务参与者返回异常或超时未返回则进行回滚提交
    • callback 补偿回调阶段 当事务超时提交时,则由MQ进行回调查询数据库本地事务情况
    • commit/rollback 提交/回滚阶段 根据补偿回调阶段进行事务提交和回滚,实现分布式事务的最终一致性

    场景:分库分表路由字段绑定

    在这里插入图片描述

    项目背景

    该业务是在分库分表场景下,需要一个切分键字段进行数据分片路由,一般我们ToC业务的话会使用userId这样的字段进行切分。然而水平切分数据带来了数据库读写性能的同时也存在一个问题,那就是查询必须携带切分键才可以完成,因为要依赖它进行数据路由查询,比如在以userId进行数据路由切分时,如果想按照用户的身份证、姓名等进行匹配查询是无法实现的,因为我们事先是不知道userId、身份证、姓名的等值匹配关系。一般而言,我们可以通过HBase + ES的方案进行解决,即监听不同库的binlog日志,将其按照时间进行排序切分汇入HBase表中,加入要检索的索引到ES中解决分库分表下数据切片产生的聚合问题。

    分布式事务

    基于以上场景,除了通过HBase+ES实现之外,还可以通过切分键与非切分键进行数据绑定解决,但是由于切分键与非切分键的路由一般不一致,数据会分散到不同库,因此无法做本地事务,这是我们需要解决的分布式事务问题。

    设计方案

    字段处理方式路由键存储格式
    切分键DB同步写,按照切分键路由切分键<切分键,非切分键A,非切分键B,非切分键C>
    非切分键MQ异步写,按照非切分键路由冗余存储,保存与切分键数据关系非切分键<非切分键A,切分键>
    <非切分键B,切分键>
    <非切分键C,切分键>
    • 交互流程
    切分键数据同步写
    ack
    非切分键数据异步写
    ack
    commit
    ack
    commit
    ack
    超时回调查询本地事务状态
    成功
    失败
    cancel
    cancel
    阶段
    prepare
    DB
    prepare结果
    MQ
    阶段
    commit
    DB
    commit结果
    MQ
    结束
    阶段
    Cancel
    DB
    MQ

    场景Q&A

    • Q:异步MQ写有延迟,查不到切分键如何处理?

      A:事务处理开始阶段通过Redis记录事务开启的分布式锁标识,当其他存在冲突的同业务在该事务的处理过程有查询时,通过判断分布式锁标识是否存在来判断事务的开启,若存在则异步等待并发起间隔查询直到事务超时,若事务超时周期内反复查询到则返回,否则根据事务处理后结果返回

    • Q:本地事务与MQ事务是如何协作的?

      A:相当于两个2PC事务协作。

      • 1.一阶段DB、MQ同时prepare(并行)
      • 2.二阶段DB先commit,成功后MQ再commit(串行)
      流程阶段操作Ack反馈持久化是否结束分布式事务成功
      正向流程PrepareDB prepare
      MQ prepare
      YesNoNoNo
      正向流程CommitDB commit
      MQ commit
      YesYesYesYes
      ------
      异常流程PrepareDB 或 MQ 异常NoNoYesNo
      异常流程CommitDB提交异常NoNoYesNo
      异常流程CommitMQ提交超时
      回调本地事务状态,本地事务成功则提交MQ事务
      YesYesYesYes
      异常流程CommitMQ提交超时
      回调本地事务状态,本地事务失败则取消MQ事务
      YesNoYesNo
    • Q:会不会存在MQ事务成功,本地事务失败?

      A:不会,而且要避免这种情况发生。两个2PC事务的prepare准备阶段可以同时发起,但在commit提交阶段要先保证本地数据库事务成功之后再进行MQ事务消息的commit,也就是在commit阶段是存在依赖关系、串行化之行的

    • Q:事务消息如何确保最终一致?

      A:prepare阶段失败、本地事务commit阶段则均不会持久化;当prepare阶段成功、本地事务commit成功,此时MQ的commit阶段异常,则依赖MQ事务消息的超时commit机制触发回调本地事务状态接口方法来决定MQ的二阶段是commit还是cancel

    1.3 TCC(Try-Commit-Cancel)

    交互流程

    在这里插入图片描述
    TCC事务其实主要包含两个阶段:Try阶段、Confirm/Cancel阶段。

    • try-尝试执行业务
      完成所有业务检查(一致性)
      预留必须业务资源(准隔离性)
    • confirm-确认执行业务
      真正执行业务
      不作任何业务检查
      只使用Try阶段预留的业务资源
      Confirm操作必须保证幂等性
    • cancel-取消执行业务
      释放Try阶段预留的业务资源
      Cancel操作必须保证幂等性

    从TCC的逻辑模型上我们可以看到,TCC的核心思想是,Try阶段检查并预留资源,确保在Confirm阶段有资源可用,这样可以最大程度的确保Confirm阶段能够执行成功。这里的资源可以是DB,或者MQRPC,只要是分布式环境中的事务载体就可以,而且需要这些分布式事务的参与者具备正逆向条件,比如DB、MQ的事务可以支持2PC,可以根据协调者对其进行事务提交或者取消操作,RPC比如账户服务可以支持正向增加也可以支持逆向减少,除此之外,DB、MQ要自身支持事务的ACID,这是参与分布式事务的原子性保证,RPC底层也是DB,这里可以等同理解。以上参与者具备参与分布式事务的基本条件后便可以进行整合和使用,业务流程的驱动和事务的完整性由中间协调者来操作和推进。

    场景:积分商品兑换

    在这里插入图片描述

    项目背景

    这是一个电商系统比较经典的下单、扣款、发货流程,在下单之前会通过一系列商品在架状态、库存数量、购买限制等有效性过滤,然后在业务系统中进行一个商品兑换的场景。

    分布式事务

    由于是商品兑换,对于用户和系统本身来说是这个过程一个原子性的、一键完成的操作,因此下单+动账+发货是一个现实存在的分布式事务。这里假设订单数据和动账数据在一个本地数据库事务中,持久化开启数据库本地事务,该事务中记录订单生成数据动账数据信息,以及发货状态的信息记录。这里需要解决的分布式事务是订单数据、动账数据、发货状态三种的最终一致

    设计方案

    数据系统事务正向流程逆向流程
    订单数据本地系统本地事务本地事务2PC保证定时任务,异常关单
    动账数据本地系统本地事务本地事务2PC保证定时任务,逆向补账
    发货状态外部系统分布式事务联同本地事务提交 / 定时任务补偿提交定时任务,驱动发货或取消
    • 正向流程
    1.商品兑换
    2.下单&动账
    3. 调用发货
    4. 变更发货状态
    补偿轮询订单
    5. 发货成功
    开始
    营销系统
    账户表
    订单表
    发货状态
    发货系统
    定时任务
    结束
    • 补偿流程
    1.轮询订单
    2.补偿发货
    3.1 标记发货成功
    3.2 回滚账户&关闭订单&标记发货终止
    定时任务
    营销系统
    发货系统
    发货状态
    发货成功
    账户表
    订单表
    发货状态
    发货失败
    结束

    场景Q&A

    • Q:动账扣款成功,但是发货失败怎么办?

      A: 定时任务根据发货状态进行发货流程驱动

      • 定时任务补偿再次发货
        发货成功则分布式事务最终一致,下游发货系统进行发货防重处理
      • 发货失败进入逆向流程
        定时任务驱动发货最终一致理论上可以一直进行,但是发货可能有一个流程时效和库存售罄的问题,可以根据业务场景进行配置比如2天内重复调用失败或调用返回无库存则进入逆向关单退款流程使得分布式事务恢复成最开始的一致性状态
    • Q:逆向流程回滚账户扣款,怎么防重?

      A:账户流水表做唯一索引正逆向类型 + 业务ID,和账户额度表进行本地事务操作,确保只能成功一笔正向/逆向业务操作

    场景:广告任务结算

    在这里插入图片描述

    项目背景

    当一个App有了足够多的用户体量,便开始有商家进行广告或商品的投放,平台通过包装运营活动、广告位等,将用户曝光与商家付费结合达到流量变现的目的。

    分布式事务

    当用户进行浏览、关注、商品购买、视频观看、App下载等多种任务,我们会根据商家配置等付费规则进行商家广告费用的扣减,同时还要为用户完成任务进行奖励结算,此时的分布式事务便是商家账户扣减与用户账户增加的数据一致性问题

    设计方案

    角色数据系统操作
    平台业务流水结算系统扣减商户费用、增加用户余额
    商户商户余额商户系统扣减费用
    用户用户余额用户系统增加余额
    • 交互流程
    1.完成任务
    2.扣减商户费用
    3.增加用户余额
    用户
    结算系统
    商户系统
    用户系统
    • 补偿流程
    轮询订单状态
    扣减
    结算
    定时任务
    结算状态
    商户扣减失败
    结束
    用户未结算

    场景Q&A

    • Q:商户扣款失败或者商户扣款成功,用户结算失败怎么办?

      A: 定时任务根据结算状态进行结算流程驱动,会一直轮询补偿尝试结算用户,直到成功。

    • Q:商户扣款成功,用户结算失败为何不进行做业务超时的逆向流程回滚商家扣款?

      A: 用户做任务时一定是做了前置校验进行平台任务发放的,也就是说用户任务只要完成必须要进行结算,这是一个不能逆向的流程。即使极端情况下商户余额空了暂时无法结算到用户也要一直重试,一旦商户余额充足则继续整个结算流程。

    场景:运营活动抽奖

    在这里插入图片描述

    项目背景

    抽奖是运营活动中比较常见的方式,对于用户来说需要做的是参加设定人物获取积分,攒够积分就可以开始抽奖,抽中后即等待奖品入账,一般券会立刻入账使用,而实物商品则需要耐心等待物流送到用户手上。

    分布式事务

    关于抽奖,涉及账户动账、库存参与次数扣减、抽奖等多个环节,该场景要解决的分布式事务是账户动账、活动库存变更、抽奖下单数据一致性

    设计方案

    数据系统操作
    账户余额交易系统扣减账户余额
    活动库存运营活动系统扣减库存、用户日参&总参
    业务流水运营活动系统业务ID[动账凭证],抽奖ID[抽奖凭证],活动ID
    抽奖流水抽奖系统抽奖下单,获取中奖结果
    • 交互流程
    1.库存扣减&日参总参累计
    2.账户动账
    3.抽奖下单
    用户抽奖
    运营系统
    交易系统
    抽奖系统
    • 补偿流程
    轮询业务流水状态
    业务流水关单
    业务流水关单&退款
    定时任务
    动账状态
    动账扣减失败
    结束
    抽奖下单失败

    场景Q&A

    • Q:动账扣减失败,补偿流程为何不驱动扣减完成抽奖?

      A: 抽奖业务对于用户来说实时性要求很高,正向流程没有完成的话,没有通过补偿流程驱动的必要性了,用户体验不好容易产生问题,补偿流程只针对账户扣减成功扣没有顺利完成抽奖的情况进行账户补款即可。而且这部分补款是有延迟的,在C端展示可以优化或者忽略合并掉,保证的是账户额度无损。

    2. 弱一致性

    2.1 最大努力通知 + 消息重试控制

    场景:数据变更同步下游业务方

    在这里插入图片描述

    项目背景

    系统数据发生变更时,会对外部系统产生一定影响,外部系统需要知道这种数据变化,这便是数据状态同步的场景。一般来说数据交互可以有推(Push)、拉(Pull) 两种形式,这里先说推模式,即数据变更方负责将变化通知到数据关注方。

    分布式事务

    这里要保证的是数据变更在多个应用中的状态一致

    设计方案

    角色驱动方式通信方式
    数据变更方MQ + RPC 最终一致调用接口通知其他系统
    数据关注方RPC调用成功更新数据提供接口接收数据变更
    • 交互流程
    RPC
    retry
    RPC
    retry
    RPC
    retry
    数据变更
    MQ
    业务A
    MQ
    业务B
    MQ
    业务C

    场景Q&A

    这里是弱一致性的实现,没有做本地事务表和定时任务轮询对比各事务状态进行补偿操作。完全依赖于MQ的失败重试驱动,若RPC调用失败即数据同步业务方失败,MQ会一直进行重试操作,随着重试次数增加,重试间隔也会增加,这里也可以业务自行进行最大努力尝试次数的控制,超过多少次尝试仍失败则放弃,因此不能保证最终一致

    场景:数据变更广播下游业务方

    在这里插入图片描述

    项目背景

    这里是数据同步的说拉模式,即数据关注方对数据变更方进行数据状态变更的监听,这种处理方式处理的主动权在于数据关注方,数据变更方只负责和保证一定通知到数据变更情况,是否能够同步成功则由监听方处理和兼容。

    分布式事务

    这里要保证的是数据变更在多个应用中的状态一致

    设计方案

    角色驱动方式通信方式
    数据变更方生产MQ数据变更存入MQ队列
    数据关注方监听MQ消费MQ处理数据变更情况
    • 交互流程
    produce
    produce
    produce
    consume
    consume
    consume
    数据变更
    Topic
    Queue
    Queue
    Queue
    业务A
    业务B
    业务C

    场景Q&A

    这里也是弱一致性的实现,没有做本地事务表和定时任务轮询对比各事务状态进行补偿操作。完全依赖于MQ消费方的处理,若消费方处理失败或在消息队列规定时间内没有消费完毕,则数据无法保证最终一致

    2.2 战略放弃 + 报警 + 人工修复

    场景:秒杀库存回滚

    在这里插入图片描述

    项目背景

    在秒杀场景中,最复杂的除了解决高并发问题外,最核心的就是活动商品的库存控制、变更问题,一般商品库存会初始化到Redis缓存中进行管理,秒杀方法会对Redis缓存库存数量进行校验、扣减操作,通过MQ异步扣减DB库存,既利用Reids原子操作进行库存数量操作,又利用缓存抗住高并发请求,起到异步削峰的作用,这是秒杀的正向流程。而逆向流程是用户秒杀到商品预占了库存,但是没有及时进行订单支付或者进行了订单取消,此时要发起对库存的恢复操作。

    分布式事务

    这里的分布式事务是Redis缓存库存与DB库存数量一致性问题

    设计方案

    存储介质库存操作方式
    Redisincr 、decr累计或扣减
    DBMQ异步扣减
    • 交互流程
    1.扣减缓存库存
    2.1 异步MQ
    3.扣减库存
    2.2 创建订单
    秒杀下单
    Redis
    MQ
    DB

    场景Q&A

    • Q:秒杀场景会出现哪些分布式问题?

      A: 根据如上流程图,扣减缓存库存、创建订单、异步MQ发送是在一个同步的函数方法中的三个非原子的子步骤,而秒杀场景下流量洪峰会一瞬间打满线程,以上三个子步骤任何异步都会出现问题,因为都是先扣缓存库存数量,根据实践经验看,极端情况下会出现扣减缓存库存成功了,后面创建订单失败了或者异步MQ没有发出来无法削减DB库存数量,因此数据结果是缓存库存扣减的多,DB扣减的少,实际抢购卖出的少,换句话说就是出现了少卖的现象。

    • Q:会不会出现超卖现象?

      A: 不会。依赖于Redis单线程命令执行的保证。这里需要注意的是读、写命令不是一致,可以结合分布式锁实现,也可以通过Lua脚本实现命令的原子性执行。

    这里也是一个弱一致性的实现,业务场景我们保证不超卖即可,对于极端情况出现的库存数量无效多扣减做战略性放弃,一般情况下不会影响大多业务使用,如果非要吹毛求疵达到账户金额那种强一致性,思路也很简单,可以借助定时任务轮询对比缓存与DB库存数量进行校验,这里还要考虑到其他在行流程如超市关单库存恢复,仍然在行的秒杀活动等,保证数据处理不多加不多减。

    3. 总结

    3.1 分布式角色

    • 参与者
      可以通俗的认为是DB、RPC、MQ这些能够提供事务能力的中间件或接口服务
    • 协调者
      维系分布式事务各个参与者分布式状态的系统、中间件,如Zookeeper、业务系统

    3.2 技术保证

    • 数据库事务 数据库如MYSQL提供了2PC、XA协议,依赖于WAL + Redo Log + 刷盘策略保证
    • MQ事务 提供了2PC协议,依赖于Ack机制+刷盘策略保证

    3.2 强弱一致选择

    • 强一致性
      强一致性确保的不是事务一定成功,而是事务参与者的子事务要么全成功,要么全失败,保证子事务的最终一致。一般依赖于定时任务、补偿机制、Double Check等方式进行事务状态的校准和协调,一般设计和实现的复杂度大,参与者越多,流程越复杂,越难以维护,最终一致的延迟性和可靠性保证越难
    • 弱一致性
      弱一致性放弃了最终一致性的保证,通过最大努力实现而不保证最终的结果,这种场景减少和减低了开发和设计的复杂度

    3.3 幂等&防重

    • 业务幂等通常会定义bizId代表全局唯一的业务标识。在MQ重发、重复消费、乱序,RPC重复调用等场景进行业务防重兼容处理。
    • 如账户余额的强一致防重处理,可以结合流水表唯一索引正逆向类型 + 业务ID进行拦截
    • 一般大多依赖于数据库的唯一索引进行防重保证,如果担心数据库性能问题,可以前置缓存拦截处理

    3.4 尽早干预&补偿一致

    • 尽早干预
      指的是代码逻辑上尽早对串行处理的做个子事务进行回滚或逆向操作,这样可以尽快结束分布式事务,而不需要等待相对更为延迟的定时任务或其他补偿机制来驱动,这里可以使用旁路方法或不阻塞主方法放到MQ或异步线程中进行处理,比如秒杀下单发货因为库存不足或商品下架可以立刻进行发起关单退款的逆向流程
    • 补偿一致
      补偿机制一般可以通过定时任务、MQ重试来进行子事务驱动整个分布式事务的完结

    5. 参考

    《软件架构设计:大型网站技术架构与业务架构融合之道》
    用户增长运营活动系统
    电商大促秒杀活动系统
    用户中心认证系统

    展开全文
  • 主要介绍了SpringBoot+Dubbo+Seata分布式事务实战详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • SpringBoot+Dubbo+Seata分分布布式式事事务务实实战战详详解解 这篇文章主要介绍了SpringBoot+Dubbo+Seata分布式事务实战详解文中通过示例代码介绍的非常详细对大家 的学习或者工作具有一 的参考学习价值需要的朋友...
  • springCloud分布式事务实战 转载于:https://www.cnblogs.com/liuys635/p/10589458.html

     

    springCloud分布式事务实战

     

    转载于:https://www.cnblogs.com/liuys635/p/10589458.html

    展开全文
  • 分布式事务处理器的下载,编译和运行 (1)下载分布式事务处理器工程源码 https://github.com/codingapi/tx-lcn/ (2)导入eclipse (3)修改配置文件 填写分布式事务服务器地址,redis地址 ,注册中心地址...

    分布式事务处理器的下载,编译和运行
    (1)下载分布式事务处理器工程源码

    https://github.com/codingapi/tx-lcn/
    

    在这里插入图片描述
    (2)导入eclipse
    在这里插入图片描述
    (3)修改配置文件
    填写分布式事务服务器地址,redis地址 ,注册中心地址

    #######################################txmanager-start#################################################
    #服务端口
    server.port=7000   
    #tx-manager不得修改
    spring.application.name=tx-manager
    
    spring.mvc.static-path-pattern=/**
    spring.resources.static-locations=classpath:/static/
    #######################################txmanager-end#################
    
    #eureka 地址
    eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka/
    eureka.instance.prefer-ip-address=true
    
    
    #######################################redis-start#################################################
    #redis 配置文件,根据情况选择集群或者单机模式
    
    ##redis 集群环境配置
    ##redis cluster
    #spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003
    #spring.redis.cluster.commandTimeout=5000
    
    ##redis 单点环境配置
    #redis
    #redis主机地址
    spring.redis.host=127.0.0.1
    #redis主机端口
    spring.redis.port=6379
    #redis链接密码
    spring.redis.password=
    spring.redis.pool.maxActive=10
    spring.redis.pool.maxWait=-1
    spring.redis.pool.maxIdle=5
    spring.redis.pool.minIdle=0
    spring.redis.timeout=0
    #####################################redis-end#######################
    tm.transaction.netty.delaytime = 5
    
    #业务模块与TxManager之间通讯的心跳时间(单位:秒)
    tm.transaction.netty.hearttime = 15
    
    #存储到redis下的数据最大保存时间(单位:秒)
    #该字段仅代表的事务模块数据的最大保存时间,补偿数据会永久保存。
    tm.redis.savemaxtime=30
    
    #socket server Socket对外服务端口
    #TxManager的LCN协议的端口
    tm.socket.port=9999
    #TxManager最大允许的建立连接数量
    tm.socket.maxconnection=100
    
    #事务自动补偿 (true:开启,false:关闭)
    tm.compensate.auto=false
    
    #事务补偿记录回调地址(rest api 地址,post json格式)
    #请求补偿是在开启自动补偿时才会请求的地址。请求分为两种:1.补偿决策,
    tm.compensate.notifyUrl=http://ip:port/path
    
    #补偿失败,再次尝试间隔(秒),最大尝试次数3次,当超过3次即为补偿失败,失败的数据依旧还会存在TxManager下。
    tm.compensate.tryTime=30
    
    tm.compensate.maxWaitTime=5000
    #######################################LCN-end#######################
    
    logging.level.com.codingapi=debug
    

    (3)运行事务管理

    启动事务管理器 TxManagerApplication.java 
     启动redis
     启动注册中心
     测试是否在注册中心注册成功
    

    在这里插入图片描述

    视频地址:
    https://i.youku.com/i/UNDYwMjA4OTg0OA==?spm=a2h0j.11185381.module_basic_sub.A

    展开全文
  • 今年开发过很多类似本地积分扣减、本地库存扣减,同时调用rpc进行发券、兑换0元单等业务,对于分布式事务有了一点自己的开发经验,这里记录一下。 1、基本前提 在我看来,两个操作,想要保证分布式事务,必须有一个...
  • 1 什么是事务 一种可靠、一致的方式,访问和操作数据库中数据的程序单元。 2 ACID性质 并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性。 原子性(Atomicity):...
  • 分布式事务实战基于XA规范 首先我们在docker中安装2台mysql docker run -p 3308:3306 --name mysql3308 \ -e MYSQL_ROOT_PASSWORD=xxx \ -v /data/volume/mysql/data3308:/var/lib.mysql \ -d mysql:5.7 安装两...
  • (1) 添加jar &lt;dependency&gt; &lt;groupId&gt;com.codingapi&lt;/groupId&gt; &lt;artifactId&gt;transaction-springcloud&lt;/artifactId&......
  • 本资源是微服务分布式事务实战博客文章(10篇)的相关资源包,包括文章中的提到的sql,微服务和服务器地址:http://down.51cto.com/data/2454865 转载于:https://blog.51cto.com/14048134/2312709...
  • -- springCloud 事务 关键点1 --&gt; &lt;dependency&gt; &lt;groupId&gt;com.codingapi&lt;/groupId&gt; &lt;artifactId&gt;transaction-springcloud&lt;/arti...
  • 我们团队在引入go语言做微服务的过程中,遇见了分布式事务的强需求。我们的交易中心涉及大量的业务,包括了商品、库存、各类营销活动、商品权限等等,按照我们微服务的设计,需要拆分到多个微服务。原先由本地事务...
  • (1)下载分布式事务处理器工程源码https://github.com/codingapi/tx-lcn/(2)导入eclipse (3)修改配置文件填写分布式事务服务器地址,redis地址 ,注册中心地址 #服务端口 server.port=7000 #tx-manager不得修改...
  • 第1章 TCC 分布式事务快速入门 37分钟5节 1-1分布式事务的常见场景和解决方案 [05:01] 1-2TCC分布式事务的定义 [08:28] 1-3TCC分布式事务的一致性保障 [04:47] 1-4TCC分布式事务整体架构图 [05:14] 1-5微信、招商...
  • JTA分布式事务实战

    2020-04-08 22:36:28
    转载:https://www.cnblogs.com/GJB-JAVA-DSJ/p/7453960.html
  • (1) 添加jar <...-- springCloud 事务 关键点1 --> <dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId...
  • 背景是微服务项目,采用的是seata分布式事务整合flowable工作流引擎。 首先看业务场景,需要做分布式事务改造的分为工作流服务、业务服务两个微服务,其中: a.工作流服务就是flowable引擎封装的发起流程、审批等...
  • seata: config: type: nacos nacos: server-addr: 127.0.0.1 group: "SEATA_GROUP" namespace: "0d6b54d7-e53e-4a14-b554-42d4bdc16dcd" username: "nacos" password: "nacos" tx-service-group: my_test_...
  • 一、分布式事务处理器的编译和运行1)Redis 的安装和启动(1)下载redis 解压缩 (2) 启动和测试redis 1进入redis 目录 2 双击redis-server.exe 程序即可启动 3 启动客户端测试双击redis-cli.exe 输入 由于内容较多,...
  • 前言 本地事务 ...可能每个人对于微服务的理解可能都不太一样,下面就聊下分布式事务涉及到的一些概念性的东西,为后续实战做一些理论基础吧;有些部分也是摘自其他人的博客或者官方文档。 本地事务 ...
  • 一、事务基本概念 1、什么是事务事务是恢复和并发控制的基本单位,事务有四个特性(ACID),原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。 2、事务经典场景 ...
  • 启动事务管理器 启动mysql ; 启动微服务1 ; 启动微服务2 (1)正常事务测试: 不抛出异常,两边都插入 1 设计没有故障整合服务 @TxTransaction(isStart=true) @Override @Transactional public int ...
  • https://kdocs.cn/l/saDFPGzdM?f=501 [金山文档] 秒杀流程设计-分布式事务同步库存.pom
  • 本文通过一个具体案例如何实施springCloud 分布式事务 案例需求: 创建2个基于springCloud的微服务,分别访问不同的数据库;然后创建一个整合服务,调用微服务实现数据的保存到2个不同的数据库,要求采用分布式...
  • Skywalking 实现分布式追踪、Seata 分布式事务组件以及 RocketMQ 消息异步通信中间件,这些组件各司其职为微服务架构提供了有效的支撑。 从本章开始,我们综合运用这些组件,再结合我多年来分布式开发的经验,为

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,079
精华内容 9,631
关键字:

分布式事务实战