如何给女朋友解释什么是3PC?

戳蓝字“CSDN云计算”关注我们哦!

一顿愉快的小火锅之后,悠哉悠哉的回家了,于是只能开始新一轮的家庭科普了。

分布式一致性

幸好在《漫话:如何给女朋友解释什么是2PC(二阶段提交)?》中介绍过关于2PC的知识,要不然这事儿可就说来话长了。

不过还是要简单交代下背景。我们以饭店的后厨为例介绍过:

随着饭店的发展,慢慢的从只有一个厨师演变成有多个厨师,进而演变成有洗菜工、配菜师、厨师等多个职位。

当有了多种分工之后,就势必需要协调这些人之间的合作。

比如餐厅客人点了一份番茄炒蛋,然后后厨开始准备起来,洗菜工开始洗西红柿,配菜师开始准备鸡蛋,厨师开始向锅内加油准备炒菜。这是一种很正常的情况。

但是,如果消息传达的不到位,或者洗菜师傅临时不在厨房等,就会导致有的人已经开始准备起来,但是有的人并没有准备。

这就像是一个分布式系统一样的,当我们在电商网站下单的时候,需要有多个分布式服务同时服务,如支付系统进行支付、红包系统进行红包扣减、库存系统扣减库存、物流系统更新物流信息等。

但是,如果其中某一个系统在执行过程中失败了,或者由于网络原因没有收到请求,那么,整个系统可能就有不一致的现象了,即:付了钱,扣了红包,但是库存没有扣减。

这就是所谓的分布式系统的数据一致性问题。

为了解决分布式一致性问题,人们提出了很多解决方案,其中比较重要的就是2PC和3PC。之前我们介绍过了2PC,其实就是相当于在后厨引入一个协调者,他负责统筹所有参与者。

二阶段提交的算法思路是在分布式系统中引入了协调者,参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

那么整个操作被分为两个阶段:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)

但是,同时,2PC也存在一些缺点,如同步阻塞问题、单点故障问题、无法100%保证数据一致性等问题。所以人们在2PC的基础上提出了3PC算法。

三阶段提交

在二阶段提交(2PC)存在诸多问题的情况下,人们提出了三阶段提交(3PC),主要用来解决2PC存在的一些问题(但是这里提一句,3PC并没彻底解决2PC存在的所有问题)。

有一个人想要五黑玩王者荣耀,于是他开始联系自己的小伙伴们。

采用2PC的算法召集好友开黑时,会发生以下事情:

组织者:小A,我们准备玩王者荣耀,你要是可以来参加的话,现在你就登录游戏,然后在游戏好友上给我回复个消息。

小A登录自己的游戏账号,然后告诉组织者:小A已就位。

组织者:小B、小C、小D,我们准备玩王者荣耀,你要是可以来参加的话,现在你就登录游戏,然后在游戏好友上给我回复个消息。

小B、小C、小D分别登录自己的游戏账号,然后告诉组织者:小B、小C、小D已就位。

组织者发现所有人都就位了,于是在游戏上逐一通知大家,

组织者:小A,我邀请你了,你进来吧。

小A接受邀请

组织者:小B、小C、小D,我邀请你了,你进来吧。

小小B、小C、小D接收邀请

接着我们看下,如果采用3PC的方式组织王者荣耀五黑,会发生怎样的事情:

组织者:小A,我们想定在晚上8点,你有时间嘛?有时间你就说YES,没有你就说NO,然后我还会再去问其他人,这段时间你可先去干你自己的事儿,不用一直等着我。

小A:好的,我有时间。

组织者:小B、小C、小D,我们想定在晚上8点王者荣耀五黑……不用一直等我。

组织者收集完大家的时间情况了,一看大家都有时间,那么就再次通知大家。(协调者接收到所有YES指令)

组织者:小A,我们确定了晚上8点王者荣耀五黑,你要把段时间空出来,你不能再安排其他的事儿了。然后我会逐个通知其他朋友,通知完之后我会再来和你确认一下,还有啊,如果我没有特意给你打电话,你就8点上号就行了。对了,你确定能来是吧?

小A顺手设置了晚上8点闹钟,然后跟组织者说,我可以去。

组织者:小B,我们决定了晚上8点王者荣耀五黑……你就8点上号就行了。

组织者通知完一圈之后。所有朋友都跟他说:”我已经把8点这个时间段空出来了”。于是,他在8点的时候这一天又挨个打了一遍电话告诉他们:嘿,现在你们可以上号啦。。。。

小A、小B、小C、小D:我已经登录了,你拉我吧。

组织者邀请A、B、C等加入游戏。

以上过程,就是一个典型的三阶段提交(3PC)的过程,和2PC相比,3PC多了一个步骤,就是提前询问所以参与者是否都能参与,并且所有人都同意后再次通知大家登录游戏。

所谓3PC,就是把2PC的准备阶段再次一分为二,组成了三阶段。

在第一阶段,只是询问所有参与者是否可以执行事务操作,并不在本阶段执行事务操作。当协调者收到所有的参与者都返回YES时,在第二阶段才执行事务操作,然后在第三阶段在执行commit或者rollback。

这样三阶段提交就有CanCommit(事务询问)、PreCommit(事务执行)、DoCommit(事务提交)三个阶段。

3PC的处理过程

和二阶段提交对比,三阶段提交主要是在2PC的第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

接下来看看具体执行过程。

CanCommit

3PC的CanCommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。

1、事务询问:协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。

2、响应反馈:参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回YES响应,并进入预备状态。否则反馈NO

PreCommit阶段

协调者根据CanCommit阶段参与者的反应情况来决定是否可以进行事务的PreCommit操作。

假如协调者从所有的参与者获得的反馈都是YES响应,那么就会执行事务的预执行:

1、发送预提交请求:协调者向参与者发送PreCommit请求,并进入Prepared阶段。

2、事务预提交:参与者接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。

3、响应反馈:如果参与者成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令。

假如有任何一个参与者向协调者发送了NO响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断。

1、发送中断请求:协调者向所有参与者发送abort请求。

2、中断事务:参与者收到来自协调者的abort请求之后(或超时之后,仍未收到协调者的请求),执行事务的中断。

doCommit阶段

该阶段进行真正的事务提交,也可以分为以下两种情况。

如果协调证收到所有参与者的事务执行后的ACK响应,则发生如下事情:

1、发送提交请求:协调接收到参与者发送的ACK响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。

2、事务提交:参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。

3、响应反馈:事务提交完之后,向协调者发送Ack响应。

4、完成事务:协调者接收到所有参与者的ack响应之后,完成事务。

如果协调者没有接收到参与者发送的ACK响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。

1、发送中断请求:协调者向所有参与者发送abort请求

2、事务回滚:参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。

3、反馈结果:参与者完成事务回滚之后,向协调者发送ACK消息

4、中断事务:协调者接收到参与者反馈的ACK消息之后,执行事务的中断。

还有一种情况,如果参与者无法及时接收到来自协调者的doCommit或者abort请求时,会在等待超时之后,会继续进行事务的提交。

以上,就是3PC的三个主要阶段的操作流程。

3PC比2PC好在哪?

1、降低同步阻塞

在3PC中,第一阶段并没有让参与者直接执行事务,而是在第二阶段才会让参与者进行事务的执行。大大降低了阻塞的概率和时长。并且,在3PC中,如果参与者未收到协调者的消息,那么他会在等待一段时间后自动执行事务的commit,而不是一直阻塞。

2、提升了数据一致性

2PC中有一种情况会导致数据不一致,如在2PC的阶段二中,当协调者向参与者发送commit请求之后,发生了网络异常,只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据不一致性的现象。

这种情况在3PC的场景中得到了很好的解决,因为在3PC中,如果参与者没有收到协调者的消息时,他不会一直阻塞,过一段时间之后,他会自动执行事务。这就解决了那种协调者发出commit之后。

另外,2PC还有个问题无法解决。那就是协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

这种情况在3PC中是有办法解决的,因为在3PC中,选出新的协调者之后,他可以咨询所有参与者的状态,如果有某一个处于commit状态或者prepare-commit状态,那么他就可以通知所有参与者执行commit,否则就通知大家rollback。因为3PC的第三阶段一旦有机器执行了commit,那必然第一阶段大家都是同意commit的,所以可以放心执行commit。

3PC无法解决的问题

在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者abort请求时,会在等待超时之后,会继续进行事务的提交。

所以,由于网络原因,协调者发送的abort响应没有及时被参与者接收到,那么参与者在等待超时之后执行了commit操作。这样就和其他接到abort命令并执行回滚的参与者之间存在数据不一致的情况。

所以,我们可以认为,无论是二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题。

Google Chubby的作者Mike Burrows说过:

there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos。

意即世上只有一种一致性算法,那就是Paxos,所有其他一致性算法都是Paxos算法的不完整版。

福利扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!
推荐阅读:
  • 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!

  • 全球科技公司2019年终市值排名:阿里成亚洲一哥;苹果等接洽运营商,或出资建美国第四张5G网;Intel新独显细节曝光……

  • 不要让 Chrome 成为下一个 IE!

  • 人工智能尴尬的2019:需要钱却没钱可烧了

  • OPPO 物联网开放之路

  • 这三名男子靠开加密矿池获得7.22 亿美元,却不兑现收益拿去奢侈挥霍……

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tensorflow源码解析1 -- 内核架构和源码结构

1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层。比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android Framework。深度学习也不例外,框架层为上层模型开发提供了强大的多语言接…

基于 Kubernetes 实践弹性的 CI/CD 系统

大家好,我是来自阿里云容器服务团队的华相。首先简单解释一下何为 Kubernetes 来帮助大家理解。Kuberentes 是一个生产可用的容器编排系统。Kuberentes 一方面在集群中把所有 Node 资源做一个资源池,然后它调度的单元是 Pod,当然 Pod 里面可以有多个容器…

35岁真的是一个坎吗?听完35岁码农的话,我放心了!

戳蓝字“CSDN云计算”关注我们哦!之前看过一个有关程序员从刚入职到中年状态的一个视频,刚入职的程序员激情澎湃,一心想做自己想做的事情,并且想创业,就想拉拢身边的程序员同事一起创业,可是身边的同事就一…

开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题

导语 发布app后,开发者最头疼的问题就是如何解决交付后的用户侧问题的还原和定位,是业界缺乏一整套系统的解决方案的空白领域,闲鱼技术团队结合自己业务痛点在flutter上提出一套全新的技术思路解决这个问题。 我们透过系统底层来捕获ui事件流…

苹果或推出Windows版Safari浏览器;微软正“取下”Chromium版Edge浏览器的Beta标签;亚马逊申请新专利……...

关注并标星星CSDN云计算 速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周两次,打卡即read更快、更全了解泛云圈精彩newsgo go goSK海力士将于CES推出新款SSD:128层4D …

Tensorflow源码解析2 -- 前后端连接的桥梁 - Session

1 Session概述 Session是TensorFlow前后端连接的桥梁。用户利用session使得client能够与master的执行引擎建立连接,并通过session.run()来触发一次计算。它建立了一套上下文环境,封装了operation计算以及tensor求值的环境。 session创建时,…

为减少用户电话排队,阿里研发了智能客服调度系统

提到调度,大家脑海中可能想起的是调度阿里云的海量机器资源,而对于阿里集团客户体验事业群(CCO)而言,我们要调度的不是机器,而是客服资源。今天,我们邀请阿里高级技术专家力君,为大家…

基于快速GeoHash,如何实现海量商品与商圈的高效匹配?

小叽导读:闲鱼是一款闲置物品的交易平台APP。通过这个平台,全国各地“无处安放”的物品能够轻松实现流动。这种分享经济业务形态被越来越多的人所接受,也进一步实现了低碳生活的目标。 今天,闲鱼团队就商品与商圈的匹配算法为我们…

独家揭秘!阿里大规模数据中心的性能分析

阿里妹导读:数据中心已成为支撑大规模互联网服务的标准基础设施。随着数据中心的规模越来越大,数据中心里每一次软件(如 JVM)或硬件(如 CPU)的升级改造都会带来高昂的成本。合理的性能分析有助于数据中心的…

云+X案例展 | 金融类:七牛云Pandora 助阵某银行实现日志智能管理

本案例由七牛云投递并参与评选,CSDN云计算独家全网首发;更多关于【云X 案例征集】的相关信息,点击了解详情丨挖掘展现更多优秀案例,为不同行业领域带来启迪,进而推动整个“云行业”的健康发展。银行作为国民经济的重要…

函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难

背景 最近在处理线上工单的时候,遇到一个用户使用 nodejs runtime 时因为函数计算运行环境的 gcc 版本过低导致无法运行的问题,觉得非常有意思,所以深入的帮用户寻找了解决方案。觉得这个场景应该具有一定的通用性,所以在这篇文章…

蚂蚁金服核心技术:百亿特征实时推荐算法揭秘

文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性。在支付宝核心推荐业务获得了uvctr的显著提升,并较大地提…

老码农肺腑直言:为什么我不建议你学Python?

关于Python,我们听到最多的一句话就是:代码简洁。目前来看,代码量上C:Java:Python100:10:1。Python简洁度完胜,但这却也是他的“死亡缺点”!今天想跟大家分享,学Python的一系列惊天大坑……Python钱多“话少…

如何评估深度学习模型效果?阿里工程师这么做

复杂的深度模型中,如果效果不好,是因为网络设计的欠缺?还是数据天然缺陷?是训练代码的bug?还是Tensorflow自身的问题?基于此,阿里工程师推出了DeepInsight深度学习质量平台,致力于解…

开发者如何赶上 5G 风口?

戳蓝字“CSDN云计算”关注我们哦!随着5G正式步入商用,5G 技术引发广泛关注。据信息通信研究院《5G经济社会影响白皮书》预测,2030年,5G将直接带动的总产出、经济增加值、就业机会分别为6.3万亿元、2.9万亿元和800万个。据BOSS直聘…

罗辑思维在全链路压测方面的实践和工作笔记

业务的知名度越高,其背后技术团队承受的压力就越大。一旦出现技术问题,就有可能被放大,尤其是当服务的是对知识获取体验要求颇高的用户群体。 提供知识服务的罗辑思维主张“省时间的获取知识”,那么其技术团队在技术实践方面是如…