首发于 互联网架构师之路
如何理解两阶段提交?

如何理解两阶段提交?

在分布式系统中,为了让每个节点都能够感知到其他节点的事务执行状况,需要引入一个中心节点来统一处理所有节点的执行逻辑,这个中心节点叫做协调者(coordinator),被中心节点调度的其他业务节点叫做参与者(participant)。

接下来正式介绍2PC。顾名思义,2PC将分布式事务分成了两个阶段,两个阶段分别为提交请求(投票)和提交(执行)。协调者根据参与者的响应来决定是否需要真正地执行事务,具体流程如下。

提交请求(投票)阶段

更多阅览

《分布式应用系统架构设计与实践》

介绍:这是一本完整的阐述分布式应用系统架构设计及实践的数据,既有基础,也有实践,主要如下:

基础层面:全书通过完整的基础技术介绍,为读者充分阅读和理解后续的架构实践提供扎实的技术基础,例如常见中间件的技术原理、高性能、高可用、可伸缩的常见实现方案等。另外还有高可用场景下的多机房多活如何实现,数据如何保持全局的一致性等问题也会有详细讨论。

架构实践层面:全书通过几个完整的案例来阐述具体在分布式架构中的实际问题以及解决方案,例如账号系统下的会话粘连保持、数据一致性、以及实现安全的数据降级;以及秒杀系统下的流量金字塔优化、热点账户的冲扣性能优化以及扣款场景下的数据一致性问题等等这些在书中都会有详细介绍以及。

================线上京东地址点击这里===============

提交(执行)阶段

分为成功与失败两种情况。

若所有参与者都返回yes,说明事务可以提交:

若有参与者返回no或者超时未返回,说明事务中断,需要回滚:

下图分别示出这两种情况:

提交成功

提交失败

Flink基于2PC的事务性写入

Flink提供了基于2PC的SinkFunction,名为TwoPhaseCommitSinkFunction,帮助我们做了一些基础的工作。它的第一层类继承关系如下:

但是TwoPhaseCommitSinkFunction仍然留了以下四个抽象方法待子类来实现:

beginTransaction():开始一个事务,返回事务信息的句柄。

preCommit():预提交(即提交请求)阶段的逻辑。

commit():正式提交阶段的逻辑。

abort():取消事务。

下面以Flink与Kafka的集成来说明2PC的具体流程。注意这里的Kafka版本必须是0.11及以上,因为只有0.11+的版本才支持幂等producer以及事务性,从而2PC才有存在的意义。

开始事务

看下FlinkKafkaProducer011类实现的beginTransaction()方法:

如果在Flink里面明确要求exactly once语义时,就会创建事务生产者并且启动事务。

预提交阶段

FlinkKafkaProducer011.preCommit()方法的实现很简单。其中的flush()方法实际上是代理了KafkaProducer.flush()方法。

那么preCommit()方法是在哪里使用的呢?答案是TwoPhaseCommitSinkFunction.snapshotState()方法。从前面的类图可以得知,TwoPhaseCommitSinkFunction也继承了CheckpointedFunction接口,所以2PC是与检查点机制一同发挥作用的。

结合Flink检查点的原理,可以用下图来形象地表示预提交阶段的流程:

每当需要做checkpoint时,JobManager就在数据流中打入一个屏障(barrier),作为检查点的界限。屏障随着算子链向下游传递,每到达一个算子都会触发将状态快照写入状态后端(state BackEnd)的动作。当屏障到达Kafka sink后,触发preCommit(实际上是KafkaProducer.flush())方法刷写消息数据,但还未真正提交。接下来还是需要通过检查点来触发提交阶段。

提交阶段

FlinkKafkaProducer011.commit()方法实际上是代理了KafkaProducer.commitTransaction()方法,正式向Kafka提交事务。

该方法的调用点位于TwoPhaseCommitSinkFunction.notifyCheckpointComplete()方法中。顾名思义,当所有检查点都成功完成之后,会回调这个方法。

该方法每次从正在等待提交的事务句柄中取出一个,校验它的检查点ID,并调用commit()方法提交之。这阶段的流程可以用下图来表示:

可见,只有在所有检查点都成功完成这个前提下,写入才会成功。这符合前文所述2PC的流程,其中JobManager为协调者,各个算子为参与者(不过只有sink一个参与者会执行提交)。一旦有检查点失败,notifyCheckpointComplete()方法就不会执行。如果重试也不成功的话,最终会调用abort()方法回滚事务。

2PC的缺点

1、协调者存在单点问题。如果协调者挂了,整个2PC逻辑就彻底不能运行。

2、执行过程是完全同步的。各参与者在等待其他参与者响应的过程中都处于阻塞状态,大并发下有性能问题。

3、仍然存在不一致风险。如果由于网络异常等意外导致只有部分参与者收到了commit请求,就会造成部分参与者提交了事务而其他参与者未提交的情况。

欢迎移步搜索关注公众号:互联网架构师之路(hlw_architector),获取最新架构材料。

玻璃钢生产厂家乌海玻璃钢天花吊顶滁州玻璃钢外壳成都不锈钢家具哪家好忻州玻璃钢卡通雕塑厂长沙玻璃钢花槽哪家好温州玻璃钢摆件制造黄冈玻璃钢景观雕塑制造淮北玻璃钢家具生产厂家成都玻璃钢装饰工程生产厂家信阳玻璃钢装饰制造益阳玻璃钢设备外壳滁州玻璃钢花箱制造铁岭玻璃钢制品公司昆明玻璃钢餐桌椅厂家淄博玻璃钢公仔雕塑定做鄂州玻璃钢树池厂家湖南玻璃钢设备外壳制造台湾商场美陈加工抚州玻璃钢花钵安庆玻璃钢垃圾桶定制西宁玻璃钢雕塑批发永州玻璃钢装饰厂新余玻璃钢餐桌椅厂河源玻璃钢装饰工程多少钱濮阳玻璃钢装饰哪家好广安玻璃钢装饰工程定制邵阳玻璃钢浮雕武汉玻璃钢装饰造型哪家好西安玻璃钢前台定制宝鸡玻璃钢座椅加工香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化