游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

我想进大厂之分布式事务篇

  对于分布式事务,相信所有人都应该很了解,为什么会有分布式事务?无论是数据量导致的分库,还是现在微服务盛行的场景都是他出现的原因。
  这一篇内容还是避免不了俗套,主要的范围无非是XA、2PC、3PC、TCC,再最后到Seata。
  但是,我认为这东西,只是适用于面试和理论的了解,你真要说这些方案实际生产中有人用吗?
  有,但是会实现的更简单,不会套用理论来实现,大厂有大厂的解决方案,中小公司用框架或者压根就不存在分布式事务的问题。
  那,为什么还要写这个?
  为了你面试八股文啊,小可爱。
  事务
  要说分布式事务,首先还是从事务的基本特征说起。
  A原子性:在事务的执行过程中,要么全部执行成功,要么都不成功。
  C一致性:事务在执行前后,不能破坏数据的完整性。一致性更多的说的是通过AID来达到目的,数据应该符合预先的定义和约束,由应用层面来保证,还有的说法是C是强行为了ACID凑出来的。
  I隔离性:多个事务之间是互相隔离的,事务之间不能互相干扰,涉及到不同事务的隔离级别的问题。
  D持久性:一旦事务提交,数据库中数据的状态就应该是永久性的。
  XA
  XA(eXtendedArchitecture)是指由XOpen组织提出的分布式事务处理的规范,他是一个规范或者说是协议,定义了事务管理器TM(TransactionManager),资源管理器RM(ResourceManager),和应用程序。
  事务管理器TM就是事务的协调者,资源管理器RM可以认为就是一个数据库。
  2PC
  XA定义了规范,那么2PC和3PC就是他的具体实现方式。
  2PC叫做二阶段提交,分为投票阶段和执行阶段两个阶段。
  投票阶段
  TM向所有的参与者发送prepare请求,询问是否可以执行事务,等待各个参与者的响应。
  这个阶段可以认为只是执行了事务的SQL语句,但是还没有提交。
  如果都执行成功了就返回YES,否则返回NO。
  执行阶段
  执行阶段就是真正的事务提交的阶段,但是要考虑到失败的情况。
  如果所有的参与者都返回YES,那么就执行发送commit命令,参与者收到之后执行提交事务。
  反之,只要有任意一个参与者返回的是NO的话,就发送rollback命令,然后执行回滚的操作。
  2PC的缺陷同步阻塞,可以看到,在执行事务的过程当中,所有数据库的资源都被锁定,如果这时候有其他人来访问这些资源,将会被阻塞,这是一个很大的性能问题。TM单点问题,只要一个TM,一旦TM宕机,那么整个流程无法继续完成。数据不一致,如果在执行阶段,参与者脑裂或者其他故障导致没有收到commit请求,部分提交事务,部分未提交,那么数据不一致的问题就产生了。
  3PC
  既然2PC有这么多问题,所以就衍生出了3PC的概念,也叫做三阶段提交,他把整个流程分成了CanCommit、PreCommit、DoCommit三个步骤,相比2PC,增加的就是CanCommit阶段。
  CanCommit
  这个阶段就是先询问数据库是否执行事务,发送一个canCommit的请求去询问,如果可以的话就返回YES,反之返回NO。
  PreCommit
  这个阶段就等同于2PC的投票阶段了,发送preCommit命令,然后去执行SQL事务,成功就返回YES,反之返回NO。
  但是,这个地方的区别在于参与者有了超时机制,如果参与者超时未收到doCommit命令的话,将会默认去提交事务。
  DoCommit
  DoCommit阶段对应到2PC的执行阶段,如果上一个阶段都是收到YES的话,那么就发送doCommit命令去提交事务,反之则会发送abort命令去中断事务的执行。
  相比2PC的改进
  对于2PC的同步阻塞的问题,我们可以看到因为3PC加入了参与者的超时机制,所以原来2PC的如果某个参与者故障导致的同步阻塞的问题时间缩短了,这是一个优化,但是并没有完全避免。
  第二个单点故障的问题,同样因为超时机制的引入,一定程度上也算是优化了。
  但是数据不一致的问题,这个始终没有得到解决。
  举个栗子:
  在PreCommit阶段,某个参与者发生脑裂,无法收到TM的请求,这时候其他参与者执行abort事务回滚,而脑裂的参与者超时之后继续提交事务,还是有可能发生数据不一致的问题。
  那么,为什么要加入DoCommit这个阶段呢?就是为了引入超时机制,事先我们先确认数据库是否都可以执行事务,如果都OK,那么才会进入后面的步骤,所以既然都可以执行,那么超时之后说明发生了问题,就自动提交事务。
  TCC
  TCC的模式叫做Try、Confirm、Cancel,实际上也就是2PC的一个变种而已。
  实现这个模式,一个事务的接口需要拆分成3个,也就是Try预占、Confirm确认提交、最后Cancel回滚。
  对于TCC来说,实际生产我基本上就没看见过有人用,考虑到原因,首先是程序员的本身素质参差不齐,多个团队协作你很难去约束别人按照你的规则来实现,另外一点就是太过于复杂。
  如果说有简单的应用的话,库存的应用或许可以算做是一个。
  一般库存的操作,很多实现方案里面都会会在下单的时候先预占库存,下单成功之后再实际去扣减库存,最终如果发生了异常再回退。
  冻结、预占库存就是2PC的准备阶段,真正下单成功去扣减库存就是2PC的提交阶段,回滚就是某个发生异常的回滚操作,只不过在应用层面来实现了2PC的机制而已。
  SAGA
  Saga源于1987年普林斯顿大学的Hecto和Kenneth发表的如何处理longlivedtransaction(长活事务)论文。
  主要思想就是将长事务拆分成多个本地短事务。
  如果全部执行成功,就正常完成了,反之,则会按照相反的顺序依次调用补偿。
  SAGA模式有两种恢复策略:向前恢复,这个模式偏向于一定要成功的场景,失败则会进行重试向后恢复,也就是发生异常的子事务依次回滚补偿
  由于这个模式在国内基本没看见有谁用的,不在赘述。
  消息队列
  基于消息队列来实现最终一致性的方案,这个相比前面的我个人认为还稍微靠谱一点,那些都是理论啊,正常生产的实现很少看见应用。
  基于消息队列的可能真正在应用的还稍微多一点。
  一般来说有两种方式,基于本地消息表和依赖MQ本身的事务消息。
  本地消息表的这个方案其实更复杂,实际上我也没看到过真正谁来用。这里我以RocketMQ的事务消息来举例,这个方式相比本地消息表则更完全依赖MQ本身的特性做了解耦,释放了业务开发的复杂工作量。
  业务发起方,调用远程接口,向MQ发送一条半事务消息,MQ收到消息之后会返回给生产者一个ACK生产者收到ACK之后,去执行事务,但是事务还没有提交。生产者会根据事务的执行结果来决定发送commit提交或者rollback回滚到MQ这一点是发生异常的情况,比如生产者宕机或者其他异常导致MQ长时间没有收到commit或者rollback的消息,这时候MQ会发起状态回查。MQ如果收到的是commit的话就会去投递消息,消费者正常消费消息即可。如果是rollback的话,则会在设置的固定时间期限内去删除消息。
  这个方案基于MQ来保证消息事务的最终一致性,还算是一个比较合理的解决方案,只要保证MQ的可靠性就可以正常实施应用,业务消费方根据本身的消息重试达到最终一致性。
  框架
  以上说的都是理论和自己实现的方式,那么分布式事务就没有框架来解决我们的问题吗?
  有,其实还不少,但是没有能扛旗者出现,要说有,阿里的开源框架Seata还有阿里云的GTS。
  GTS(GlobalTransactionService全局事务服务)是阿里云的中间件产品,只要你用阿里云,付钱就可以用GTS。
  Seata(SimpleExtensibleAutonomousTransactionArchitecture)则是开源的分布式事务框架,提供了对TCC、XA、Saga以及AT模式的支持。
  那么,GTS和Seata有什么关系呢?
  实际上最开始的时候他们都是基于阿里内部的TXC(TaobaoTransactionConstructor)分布式中间件产品,然后TXC经过改造上了阿里云就叫做GTS。
  之后阿里的中间件团队基于TXC和GTS做出了开源的Seata,其中AT(AutomaticTransaction)模式就是GTS原创的方案。
  至于现在的版本,可以大致认为他们就是一样的就行了,到2020年,GTS已经全面兼容了Seata的GA版本。
  整个GTS或者Seata包含以下几个核心组件:TransactionCoordinator(TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。TransactionManager(TM):控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。ResourceManager(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
  无论对于TCC还是原创的AT模式的支持,整个分布式事务的原理其实相对来说还是比较容易理解。事务开启时,TM向TC注册全局事务,并且获得全局事务XID这时候多个微服务的接口发生调用,XID就会传播到各个微服务中,每个微服务执行事务也会向TC注册分支事务。之后TM就可以管理针对每个XID的事务全局提交和回滚,RM完成分支的提交或者回滚。
  AT模式
  原创的AT模式相比起TCC的方案来说,无需自己实现多个接口,通过代理数据源的形式生成更新前后的UNDOLOG,依靠UNDOLOG来实现回滚的操作。
  执行的流程如下:TM向TC注册全局事务,获得XIDRM则会去代理JDBC数据源,生成镜像的SQL,形成UNDOLOG,然后向TC注册分支事务,把数据更新和UNDOLOG在本地事务中一起提交TC如果收到commit请求,则会异步去删除对应分支的UNDOLOG,如果是rollback,就去查询对应分支的UNDOLOG,通过UNDOLOG来执行回滚
  TCC模式
  相比AT模式代理JDBC数据源生成UNDOLOG来生成逆向SQL回滚的方式,TCC就更简单一点了。TM向TC注册全局事务,获得XIDRM向TC注册分支事务,然后执行Try方法,同时上报Try方法执行情况然后如果收到TC的commit请求就执行Confirm方法,收到rollback则执行Cancel
  XA模式TM向TC注册全局事务,获得XIDRM向TC注册分支事务,XAStart,执行SQL,XAEND,XAPrepare,然后上报分支执行情况然后如果收到TC的commit请求就执行Confirm方法,收到rollback则执行Cancel
  SAGA模式TM向TC注册全局事务,获得XIDRM向TC注册分支事务,然后执行业务方法,并且上报分支执行情况RM收到分支回滚,执行对应的业务回滚方法
  总结
  这里从事务的ACID开始,向大家先说了XA是分布式事务处理的规范,之后谈到2PC和3PC,2PC有同步阻塞、单点故障和数据不一致的问题,3PC在一定程度上解决了同步阻塞和单点故障的问题,但是还是没有完全解决数据不一致的问题。
  之后说到TCC、SAGA、消息队列的最终一致性的方案,TCC由于实现过于麻烦和复杂,业务很少应用,SAGA了解即可,国内也很少有应用到的,消息队列提供了解耦的实现方式,对于中小公司来说可能是较为低成本的实现方式。
  最后再说目前国内的实现框架,云端阿里云的GTS兼容Seata,非云端使用Seata,它提供了XA、TCC、AT、SAGA的解决方案,可以说是目前的主流选择。
  微信搜索公众号【艾小仙】回复【PDF】获取百本计算机电子书,文章每周持续更新。我是艾小仙,阿里巴巴技术专家,我们下期见!
  另外,多说一句,我开通了星球,免费的那种,不用氪金。
  星球的话也是一个分享的途径,有时候想分享的一点东西根本凑不到一篇文章,而且也比较散乱无章,所以星球是个不错的方式。
  还有就是平时也有挺多同学向我问问题的,由于我现在好友人数太多了,有时候我就是顺手把红点点了(强迫症),根本没注意到说了啥,后面就忘记要回复了,星球的话大家可以向我提问,我有空了就会回复,至少不会和微信里一样遗漏。
  扫描下方二维码就可以加入星球吹牛逼了。

闫妮为什么这么火,闫妮什么时候出道的闫妮说出来很多人清楚,可她为什么这么火,很多网友就想去了解一下有关的故事,看她能给自己表演特别火,完全是她有一定的演技实力存在,开始演火的作品带动后变得这么火,但有的网友就不清……无需出国乌克兰国立大学在线预科全国报名中不染病毒在家留学乌克兰国立大学在线预科全国火热报名中,不染病毒,在家留学申请截止时间:2020年11月10日不管你是去乌克兰学音乐或美术,还是文科理科,都需要学习一年的预科语言课程……演员闫妮个人资料简介,演员闫妮的现任老公是谁近日有闫妮主演的新剧《亲爱的爸妈》备受网友的关注,一时间关于演员闫妮个人资料简介,演员闫妮的现任老公是谁?这些问题再次被网友提及,接下来就和小编一起来看看吧。1演员闫妮个……演员闫妮结过几次婚,闫妮有几任丈夫说到闫妮大家应该都认识,曾经在《武林外传》中饰演的佟掌柜一角让人印象深刻,但是关于演员闫妮结过几次婚,闫妮有几任丈夫?这个问题网友也是十分的好奇,下面就和小编一起来看看吧。……闫妮老公叫什么现任2021,闫妮个人资料简介简历起底《武林外传》中角色佟湘玉的扮演者是闫妮,凭借这个角色她在国内大火。那么,闫妮老公叫什么现任2021,闫妮个人资料简介简历起底被扒,一起去了解下。1闫妮老公叫什么现任2021……与王菲离婚5年,李亚鹏泛泪说出这件事男星李亚鹏,曾与王菲有过8年婚姻关系,两人离婚后仍维持良好互动,2014年锋菲恋世纪复合,他也在微博大方送祝福,近日上节目,罕见谈及离婚一事。李亚鹏获邀至《鲁豫有约一日行……演员潘粤明的逆袭之路。云南虫谷会再大火吗?潘粤明无疑是个好演员。一开始就是,为什么这里我又用逆袭这两个字呢?皆因从2011年到2017年这七年之中,他很少作品,也很少出现在媒体头版上,几乎可以用销声匿迹来形容。正当我们……闫妮女儿近照曝光素颜出镜闫妮主演的电视剧闫妮主演的电视剧,这一路走来,闫妮可以说是为我们带来很多好看的电视剧,然而,闫妮自身就可以算的上是一部女人的励志史,前夫出轨,抛下了她与还未出生的孩子,然而她并没有因此堕落缠论……王菲现在的老公是哪个,王菲年龄多大九十年代中国最火的歌手王菲给观众带来许多好听的音乐,不过现在有52岁的她感情生活经历一波三折,最后她没有寻找到合适老公过日子,估计她存在任性的性格,使得她遇见的婚姻生活不多么完……汤唯的牺牲,远比色戒里呈现出的更巨大,金星都为她不平眼看她起高楼,眼看她楼塌了,《色戒》让汤唯一夜爆红,又让汤唯一夜消失。从光彩夺目到无戏可拍,如此巨大的落差,金星都为她鸣不平:《色戒》也不是她一个人演的,为什么封杀……李亚鹏的现任妻子叫啥名,李亚鹏的生肖商海沉浮多年的李亚鹏近期再次收获到幸福的婚姻生活,可见得属猪的他变低调很多,直到他的孩子出生,逐渐他把现任妻子海哈金喜的消息公开,来让众多观众感觉惊喜的消息,毕竟他上一段婚姻生……热度近期飙升的十大00后女明星,文淇张子枫蒋依依领衔根据最近七日(2021年5月15日2021年5月22日)百科词条阅读量监测结果,我们来看看,过去七天,00后女明星谁最火?圈粉最多的前十名都有谁?我们分别来扒一扒她们的八卦:第……
江南受邀阅文超级IP盛典龙族获超级IP杰出作品奖星关系1月14日讯近日,由东方卫视、阅文集团联合主办的中国原创网络文学IP盛典2018阅文超级IP风云盛典在上海完美落幕。盛典当晚,众多影视明星、实力歌手、业内文坛大咖悉数到场……我家那闺女何雯娜惊喜发糖奥运冠军恐最先告别单身星关系1月14日讯聚焦社会独居群像,传递暖心情感共鸣。近期,湖南卫视观察成长励志升级之作《我家那闺女》已于上周六晚正式和观众见面,凭借何雯娜、吴昕、袁姗姗、傅园慧四位闺女私密独……王博文亮相百合杯表彰典礼献唱夜空中最亮的星星关系1月14日讯近日,人气歌手、演员王博文亮相2018年度电影频道百合杯表彰典礼。王博文作为开场嘉宾演唱歌曲《夜空中最亮的星》,声音清澈纯净,穿透力十足,颇有辨识度。百……司藤秦放为何对陈宛念念不忘?他的三段恋情说明了什么?秦放,电视剧《司藤》剧照电视剧《司藤》热播,剧中最圈粉的人除了司藤,估计就是傲娇的暖男秦放了。秦放是由张彬彬饰演的,本身颜值就很出众,在剧里更是帅气多金,而且细心周到,善……大冰小将易烊千玺成为最暖经理人雷佳音获称暖场王由国家体育总局冬季运动管理中心联合浙江卫视制作的国内首档少儿燃动冰雪成长类节目《大冰小将》于1月12日(周六)晚20:30播出了首期节目。节目中,肩负《大冰小将》金牌经理人和全……丈夫的生命本来可以撑一周?妻子却想别撑了,放弃吧!让人泪目在《人间告白》中作者金鱼酱说过这样一句话:当我们害怕死亡之时,其实正是敬畏生命的开始。并不是她成熟,不过生活逼得满身才华,本来想要哭的时候,却学会了笑,本想寻找依赖的时候……谭维维助阵梦想的声音巅峰歌会暖心演绎带我到山顶历经三个月,浙江卫视大型音乐圆梦节目《梦想的声音》第三季迎来了最后一期巅峰歌会,梦想导师谭维维继续用挚爱的音乐点燃舞台,不仅与林俊杰、张靓颖、胡彦斌、王嘉尔等导师合作演绎《我相……被名字耽误的好大学,录取分数居高不下,常被外行当成大专嘲笑名字虽然只是一种称呼和代号,却在很多人眼里是非常重要的。名号够不不够响亮,在高校招生中,也成为一个可以产生影响力的因素。大学更改名字并不算什么特殊的新闻,不过也偶尔会出现……林更新惊喜现身野生厨房艰难抓雪蛤雪地尽情撒野今天中午12:00,由芒果TV推出的国内首档野生料理纪实综艺《野生厨房》将迎来收官之旅,林更新作为飞行嘉宾惊喜现身最后一期节目也引来不少网友的关注。节目一开场林更新便在雪地里瑟……赵薇出席话剧求证见面会首谈创作感悟畅聊角色塑造过程星关系1月12日讯1月11日,赵薇身着时髦叠穿连身裙出席话剧《求证》媒体及粉丝见面会。话剧不久前曝光一组排练花絮,引发网友广泛的讨论,此次赵薇来到见面会现场,不仅首度剖析了自己……白百何情圣2发布会分享感悟揭爱情真谛星关系1月11日讯农历新年将至,继18年春节档《捉妖记2》口碑票房双丰收,今年春节档白百何再携新作如期而至。由白百何和吴秀波、肖央主演的春节爱情喜剧《情圣2》昨天在北京举办情圣……年味有FUN第三季首播大受好评王源为家人秀厨艺感动满满星关系1月11日讯岁月偷去了年华,听着年末的钟声悠远,最期待的永远是一顿阖家团圆的年夜饭。无论酸甜苦辣,都是由味及心的相聚。尽管如今年味的消逝是时代的命题,庆幸还有全网首档CN……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网