分布系统中,如何保证数据的一致性、原子性,分布式事务。分布式事务分为两大类,柔性事务、刚性事务。

一、方法论篇

分布式事务主要分为两部分,刚性事务和柔性事务。刚性事务主要针对DB层面,严格保证事务的原子性要么都成功,要么执行失败,全部回滚。
柔性事务,相对于刚性事务来的,为了保证DB的利用率,以及系统的吞吐量,不会长时间锁定DB资源,在事务执行失败之后不会进行回滚,而是采用补偿的方式保证数据的最终一致性,所以柔性事务又叫补偿型事务。先来介绍刚性事务。

1.1刚性事务

X/Open XA 协议,最早的分布式事务模型是 X/Open 国际联盟提出的 X/Open Distributed Transaction Processing(DTP)模型,也就是大家常说的 X/Open XA 协议,简称XA 协议。
名词解释:
  • 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务开始和结束)并访问事务边界内的资源。
  • 资源管理器(Resource Manager,简称RM):Rm管理计算机共享的资源,许多软件都可以去访问这些资源,资源包含比如数据库、文件系统、打印机服务器等。
  • 事务管理器(Transaction Manager ,简称TM):负责管理全局事务,分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚、失败恢复等。
操作过程
  • 第一阶段,AP发起事务,TM要求所有的RM准备提交对应的事务分支,询问RM是否有能力保证成功的提交事务分支,RM根据自己的情况,如果判断自己进行的工作可以被提交,那就就对工作内容进行持久化,并给TM回执OK;否者给TM的回执NO。RM在发送了否定答复并回滚了已经的工作后,就可以丢弃这个事务分支信息了。
  • 第二阶段TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare回执NO的话,则TM通知所有RM回滚自己的事务分支。
其本质就是一个2PC过程

1.1.1 2PC

第一阶段,资源预占阶段(准备阶段),所有RM回复OK,则提交事务,否则失败。
第二阶段,事务提交阶段(资源执行阶段),所有执行成功则执行成功,否则返回失败。

1.1.2 3PC

比2pc多一个阶段,增一个CanCommit子阶段不占有资源,提升性能。

1.1.3 小结

刚性事务是一个阻塞性的事务(DB层面的一种定义)会占用,过多资源,并发度低,会导致吞吐量偏低。一般不建议在耗时较大的分布式事务中使用刚性事务。

1.2柔性事务

就过程本质上也是2pc阶段,只不过在应用层面实现减少对DB的持有时间,是一种补偿型事务,事务执行失败,进行补偿,最终保证事务成功,而不做回滚。其实利用的Base理论,保证服务的基本可用,是CAP模型中AP模型的演化结果。
ba(base available)基本可用;
s(soft state)中间状态;
e(eventual consistency)最终一致性的理论。

1.2.1TCC

TCC(Try-Confirm-Cancel),期模型完全交由业务方实现,每个在业务中的子模块都需要实现Try,Confirm,Cancel三个接口,对业务入侵极大。有原来的一个接口就实现完的内容现在需要二外的多增加两个接口,开发量增加了两倍。TCC让应用程序自己定义数据库操作的粒度,使得降低锁冲突、提高吞吐量成为可能。

名词解释:

T(Try):完成业务方面的检查,预留相关的资源。假设一个业务完成需要A,B,C三个子事务完成,这时候需要调用A,B,C三个业务的Try接口。

C(Confirm):成功预占资源(A,B,C三个Try都成功),真正的执行业务;

C(Cancel):事务执行失败(A,B,C三个Try只要有一个失败),释放Try阶段的资源。

问题:超时如何处理?
 超时需要重试,所以接口实现接口需要幂登。

1.2.2Saga

将try和confirm合成一个阶段,cancel变成补偿阶段。接下来看一下官方定义:
  • 每个Saga将一个大的分布式事务拆分为若干sub-transaction Ti
  • 每个Ti 都有对应的补偿动作Ci,补偿动作用于撤销Ti造成的结果
  • 当Saga事务中的任何一个本地事务执行失败之后,调用补偿方法恢复之前的事务,达到最终一致
  • 恢复的方式
    • 向后恢复:按照调用顺序倒序调用Ci-1之后的补偿方法。之所以从Ci-1开始,因为Ci执行失败,已经从本地事务进行回滚了。
    • 向前恢复:一直重试执行失败的事务,知道执行成功。
  • 事务特征:    
    • 不具有隔离性,需要业务方法控制并发,保证某个执行失败的事务,所占有的资源不会业务上影响别的事务执行,
    • 一致性:追中一致性

1.2.3TCC与Saga比较

 TCC                                                                            
缺点:
1、业务侵入性高,每一个本地事务都需要开发三个接口;
2、较原来与本地事务的交互次数多了一倍,较原来多了一个Confirm或者Cancel;
3、一旦进入Confirm阶段必须保证成功,不成功需要人工接入;
优点:
资源通过Try提前占用,数据能得到较好的隔离;
Sage                                                                           
优点:
1、性能开销较小,在执行成功的情况下只需要一次交互;
2、对现有业务侵入性小,现有业务几乎不需要改变,只需要增加补偿接口;
缺点
1、注意数据隔离性的问题,事务执行失败,需要关注该次事务执行的没有回滚的数据被别的事务利用,会产生脏读的问题;业务上需要控制每个事务的隔离级别。

二、实战架构篇

这里主要给大家介绍柔性分布式事务的实战。鉴于刚性事务一般会被底层存执直接实现以及由于占有资源相时间较长吞吐量交差,这里就不做介绍了。柔性事务分为两种,同步事务和异步事务。

2.1 异步事务

通过消息组件驱动的事务成为异步事务。异步事务的关注点在于必须保证发送MQ消息和本地事务执行是一个原子操作。这时候需要用户事务消息。

2.1.1 基于事务消息的异步事务

具体过程如下:   
 1、发送半消息到MQ中去,这时候订阅方式订阅不到消息的;
2、执行后面的事务;
3、后面的事务执行成功,则commit这条消息,否则rollback这条消息;
概念介绍:
半消息:对消息进行状态标记,第一次发送将消息标记为“暂不投递”状态,订阅方看不到该消息,此时的消息成为半点消息。消费端想要收到这条消息需要二次确认。
消息会查:由于网络闪断,服务重启等原因,导致半消息没有进行二次确认,或者二次企确认消息丢失,这是MQ发现某条消息长时间处于“暂不投递”状态,需要主动向消息生产者查询该消息的最终状态(是commit,还是rollback),这个需要生产者自己来实现call back。
弊端:
1、业务侵入性比较高,需要实现事务性消息的callback,业务实现复杂;
2、不支持幂等,可能会产生多天这样的消息。需要消费端做幂登处理;
3、发送消息失败可能会导致业务执行失败。

2.1.2 本地消息表架构

本质上就是将原来的事务消息改成本地消息表,在一个本地事务中完成消息落地和本地业务事务,然后通过微服务扫描未发送的消息,投递到MQ Server中去。
缺点:需要增加一张与业务无法的表。
优点:
1、将消息服务和业务解耦解除MQ对业务的影响;
2、不用开发消息回查,减少主业务的侵入。

2.2 同步事务

一个分布式事务,所依赖的本地事务都需要直接调用完成,就称之为同步事务。

2.2.1 基于TCC事务架构

TCC 分布式事务模型包括三部分:

  • 主业务服务:主业务服务为整个业务活动的发起方,服务的编排者,负责发起并完成整个业务活动。
  • 从业务服务:从业务服务是整个业务活动的参与方,负责提供 TCC 业务操作,实现初步操作(Try)、确认操作(Confirm)、取消操作(Cancel)三个接口,供主业务服务调用。
  • 业务活动管理器:以jar包组件的形式抽离出来,控制整个业务活动,包括记录维护 TCC 全局事务的事务状态和每个从业务服务的子事务状态,并在业务活动提交时调用所有从业务服务的 Confirm 操作,在业务活动取消时调用所有从业务服务的 Cancel 操作。

2.2.2 Sage架构实战

利用Fast Fail的思想在事务执行失败的情况下直接快速返回,然后异步执行补偿,下面是整体方案执行架构。将补偿服务的调用和事务的控制过程通过AOP+微服务+注册中心的形式抽离出来,让后业务仅仅关注业务即可。
包含三个部分
  • 微服务,是业务服务,主要处理实际业务,也是分布式事务的发起者,使用分布式事务只需要加入注解即可;
  • 分布式事务Proxy组件,对事务进行追踪管理以及收集每个本地事务的入参,回滚方法,以及事务执行结果,然后将这些数据落地,共补偿事务服务调用使用;
  • 分布式事务补偿服务,扫描TDB(事务数据落地的DB),执行事务失败且没有补偿成功的事务,进行补偿。

分布式事务(理论+实战)相关推荐

  1. LCN分布式事务框架实战

    本文来写个LCN分布式事务框架实战例子 文章目录 概述 概述 lcn分布式事务教程https://www.codingapi.com/docs/txlcn-preface/

  2. 分布式事务与Seate框架:分布式事务理论

    推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 给跪了!这套万人期待的 SQL ...

  3. SpringCloud Alibaba实战第九课 分布式事务理论、DevOps运维

    22 一致性挑战:微服务架构下的数据一致性解决方案 上一讲我们介绍了如何在微服务架构中设计统一的用户认证方案.本讲咱们填之前埋下的一个坑,如何在微服务架构下有效保障数据一致性问题.本讲咱们涉及三方面内 ...

  4. 分布式事务解决方案实战

    目录 1.数据库事务ACID 2.什么是分布式事务 3.单体事务和分布式事务 3.1 传统单体架构事务 3.2 微服务或者多数据源分布式事务 4.分布式事务理论基础 4.1 CAP 4.2 BASE ...

  5. 分布式事务理论-二阶段提交(Two-phase Commit)

    1 2PC 两阶段提交协议为了保证分布在不同节点上的分布式事务的一致性,我们需要引入一个协调者来管理所有的节点,负责各个本地资源的提交和回滚,并确保这些节点正确提交操作结果,若提交失败则放弃事务. 2 ...

  6. 分布式事务理论(学习笔记)

    转载自 https://blog.csdn.net/YardStrong/article/details/80199487 先附上笔记内容,最近喜欢用画图来记笔记^v^ [使用LCN]"LC ...

  7. 微服务分布式事务实战(一) 项目需求描述和实现步骤

    本文通过一个具体实例如何实施springCloud 分布式事务,不对分布式事务理论做探索.由于内容较多,分多个小节来说明 案例需求: 创建2个基于springCloud的微服务,分别访问不同的数据库: ...

  8. 教你舞动手指速写一个Seata-AT框架解决棘手的分布式事务问题

    相信大家对于事务问题都不陌生,在传统的单库环境下开发,咱们可依赖于MySQL所提供的事务机制,来确保单个事务内的一组操作,要么全部执行成功,要么全部执行失败. 例如一个下单业务中,假设由「扣减库存.新 ...

  9. 【重难点】【事务 03】分布式事务

    [重难点][事务 03]分布式事务 文章目录 [重难点][事务 03]分布式事务 一.为什么需要分布式系统架构 二.系统架构演进 1.单体应用架构 2.垂直应用架构 3.分布式架构 4.SOA 架构 ...

最新文章

  1. 自学python要看哪些书籍-Python入门自学到精通需要看哪些书籍?
  2. 在计算机上工作用英语怎么说,“Go to work”是“去上班”,那“上夜班”用英语怎么说呢?...
  3. CF986A Fair
  4. SMO写的查看数据库信息的代码
  5. Python学习总结之四 -- 这就是Python的字典
  6. 顺丰拟发行58亿可转债:15亿投入航空运力,12亿还贷款
  7. SAP License:ERP项目经理需求调研的惨痛经历
  8. UE4之vs2019IntelliSense错误
  9. Gym 100703F Game of words 动态规划
  10. Oracle使用技巧及PL/SQL Developer配置
  11. Android studio xpose的使用
  12. error C2679: binary ‘<<‘ : no operator defined which takes a right-hand operand of type ‘class s
  13. UNIX环境高级编程源码
  14. python爬虫读取pdf_Python读取PDF内容
  15. SQL优化--not in和or出的问题
  16. 极客日报第 53 期:抖音将代替拼多多成为春晚独家红包合作伙伴;高通正研发 8cx 升级版处理器,对标苹果 M1;DuckDuckGo 日查询量首次突破 1 亿
  17. 老罗斯柴尔德的第一桶金
  18. C Primer Plus 第三章编程练习一
  19. 鲲鹏与天宫:从航空城驶向智能时代的万千星辰
  20. 开源实时消息推送系统 MPush

热门文章

  1. python——time模块实现指定时间触发器
  2. linux 通配符 元字符 转义字符
  3. fastdfs-启动服务-上传文件-连接问题
  4. dj鲜生-32-用户中心-收货地址
  5. linux-基本权限UGO-读写执行权限
  6. linux-3-which-whoaii-chmod数字法与符号法
  7. Laravel 5.8 正式发布(文档翻译已启动)
  8. PCB中英对照一、 综合词汇
  9. 解决idea文件名称大小写导致GIT无法提交问题
  10. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园