需要特别说明的是,分区容错是分布式系统最基本的要求,因为我们的机器都是部署在不同的网络节点(分布式嘛),因为网络不可控问题,分区容错总是存在的,所以系统必须具备分区容错性,即需要在AP和CP做选择,因此系统架构师需要根据具体的业务场景在C(一致性)和A(可用性)之间寻求平衡。
其实在《Spring Cloud 极简入门》中在介绍Eureak集群的时候我们有探讨过 CAP理论,Eureka选择了CAP理论中的AP,保证了可用性和分区容错,放弃了数据一致性。
1.5.BASE理论与柔性事务
下面是百度百科对BASE理论的定义
BASE 理论是对 CAP 中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
其实BASE理论是根据CAP理演化而来的,就是对CAP理论中的一致性和可用性的权衡结果,是对大规模互联网系统分布式实践的总结。
BASE理论当然是牺牲了数据的强一致性,没办法做到像关系数据库那样的读写实时一致,但是它牺牲了一致性得到了可用性,BASE理论允许数据在一段时间内是不一致的,但最终达到一致状态。这种使用场景在生活中着我们随处可见,如银行转账 “我们将在24小时为您转账成功” 就可以看做是类似的场景 。
柔性事务
柔性事务的概念就是是在分布式场景下基于BASE理论定义出来的 ,它跟传统的事务(刚性事务)不一样,它不一定严格遵循事务的ACID四大特性。
2.分布式事务的解决方案
2.1.两阶段提交(2pc)
先来所以说 XA规范
XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准(即接口函数)。目前,Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持。XA协议采用两阶段提交方式来管理分布式事务。
简单理解就是XA规范协议是一种事务协议,通过这种协议来通知数据库事务的开始、结束、提交、以及回滚,XA 接口函数由数据库厂商提供。XA协议使用二阶段提交来处理分布式事务,说的更明白一点就是XA协议保证了分布式事务的原子性,要么都成功,要么都失败。
XA协议采用两阶段提交方式来管理分布式事务采用两阶段提交 2PC(Two Phase Commitment Protocol)来管理分布式事务,所谓二阶段是有两个阶段组成,一阶段投票阶段和二阶段提交阶段。同时它是由“事务协调器”和若干“事务执行者”两个角色组成。
第一阶段Prepare:准备阶段(投票阶段),
-
事务协调器向所有事务参与者发请求,询问是否可以执行提交操作(你们都可以执行事务操作吗?),并开始等待各参与者节点的响应。
-
事务参与者收到协调者的指令开始执行事务操作但是不会提交事务,同时写Undo log(写操作之前首先将数据备份log,如果要回滚就从这个log进行数据还原) 和 Redo log(修改数据在buffer pool缓冲池中修改,Redo log是对这个缓冲池的内容做持久,避免修改的数据丢失) 。
-
如果参与者事务操作都执行成功(注意哦,没提交事务哦),那么就会回复 事务协调器 “准备OK” ,如果事务操作失败,那么就会回复执行者“准备不OK”。
第二阶段Commit:
正常流程
-
事务协调器会收到参与者的回复,如果所有的参与者都回复“准备ok”,意味着所有的参与者都可以完成事务操作,那么事务协调器会向每个事务参与者发送一个“commit” 提交事务指令(既然大家都可以进行事务操作,那大家都提交事务把)
-
事务参与者收到指令就开始提交事务,然后会向事务协调器回复“完成”,事务协调器收到所有参与者都回复完成,事务完成。
回滚流程
-
如果再第一阶段事务协调器收到了某个事务参与者回复“准备不ok”即事务操作执行失败,那么事务协调器会向所有的事务参与者发送“rollback”回滚执行(有一个成员不ok,那大家都散了吧,今天的事情搞不成了)
-
事务参与者收到指令,回滚之前的事务操作,即:将数据还原到“Undo log”的数据,然后先事务协调者回复“回滚成功”,当事务协调器收到所有的参与者回复“回滚成功”后,取消事务。
发送回滚指令
二阶段提交的问题
二阶段能保证分布式事务的原子性,但是也有一些明显的缺陷。比如:
-
在第一阶段,如果参与者迟迟不回复协调者,就会造成事务的阻塞,性能不好。
-
单节点故障,如果协调器挂了,参与者会阻塞,比如在第二阶段,如果事务协调器宕机,参与者没办法回复信息,长时间处于事务资源锁定,造成阻塞(事务操作是要加锁的)。
-
在第二阶段,如果在事务协调器发出"commit"执行后宕机,一部和参与者收到了消息提交了事务,而一部分没有消息没法做出事务提交操作,这样就出现了数据不一致。
-
在第二阶段,如果事务事务协调器发出“commit”指令后宕机,收到“commmit”指令的参与者也宕机了,那么事务最终变成了什么效果,提交了还是没提交?没有谁知道。
2.2.三阶段提交(3pc)
三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本,
3PC在2PC的功能上做了两个改动,一是在协调者和事务参与者之间引入了超时机制,在第一阶段和第二阶段中插入一个准备阶段 , 保证了在最后提交阶段之前各参与节点的状态是一致的,那么现在的三阶段分为了:
-
“canCommit“询问是否能提交,
-
“papreCommit”准备提交阶段 ,
-
“doCommit”提交阶段。
第一阶段“canCommit” :
-
事务协调者向事务参与者发送 canCommit 请求询问是否能提交事务,然后等待所有事务参与者的返回
-
事务参与者接收到事务些调整的canCommit指令,然后自身认为能够提交事务则返回 “yes”否则返回“no”
第二阶段“papreCommit”
事务协调者收到所有的事务参与者的canCmmit指令的反馈结果,这里有两种情况,一是所有的反馈都是yes,二是有部分的事 务参与者返回No,后者反馈超时。
正常流程
-
如果事务协调者收到所有的事务参与者的canCmmit指令反馈结果都为YES,那么就进入papreCommit阶段。事务协调者向事务参与者发送 “papreCommit”指令。
-
事务参与者收到“papreCommit”指令,开始进行事务操作,并将undo和redo信息记录到事务日志中,如果顺利执行事务操作,则反馈ACK确认信息,然后等待下一步指令。
中断事务
-
如果事务协调者收到所有的事务参与者的canCmmit指令反馈结果出现了NO,或者等待超时,那么就执行事务中断,向所有的事务参与者发送“abort”中断指令。
-
事务参与者接收到“abort”指令,中断事务,当然如果事务参与者迟迟未收到事务协调者的指令等待超时也会中断事务。
第三阶段“doCommit阶段”
这里准备提交事务了,这里有两种情况,如果事务协调者收到所有的事务参与者的papreCommit指令反馈结果都是ACK,那么进入doCommit阶段,否则会中断事务。
正常流程
-
事务协调者收到所有的事务参与者的papreCommit指令反馈结果都是ACK,然后向事务参与者发送“doCommit”指令,通知提交事务。
-
事务参与者收到“doCommit”指令,正式执行事务提交,并且释放所有事务资源,返回向事务协调者返回事务结果状态“ACK”完成
-
事务协调者收到所有的事务参与者都返回ACK成功,完成事务。
中断事务
-
事务协调者收到的事务参与者的papreCommit指令反馈结果有的不是ACK,那么事务协调者然后向事务参与者发送“abort”事务中断指密令。
-
事务参与者收到“abort”事务指令,会根据unlog日志文件还原数据,然后释放事务资源,然后向事务协调者发送回滚“ACK”消息
-
事务协调者收到所有的事务参与者都返回ACK消息,取消事务。
2.3.2pc和3pc总结
3pc在2pc的基础上增加了超时,比如事务参与者没有收到事务协调者的提交指令,等待一定时间后会自动提交事务,减少了事务的阻塞。事务协调者咩有收到事务参与者的回复而超时,会触发事务回滚。但是3pc的问题是数据不一致,比如全局事务取消了,但是某一个事务参与者么有收到事务取消的指令,等待一段时间后会选择自动commit,这样就会造成数据不一致的情况。
2.3.TCC事物补偿
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
致性算法、Java算法、数据结构、分布式缓存**等等知识详解。
[外链图片转存中…(img-MRSil9gv-1711172957769)]
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
[外链图片转存中…(img-fHfJSHpd-1711172957769)]
[外链图片转存中…(img-5rN198qK-1711172957769)]