一个大厂面试常问的分布式知识点3pc协议详解

简介: 在之前的文章中我曾介绍了2pc协议的相关知识,这篇文章开始介绍3pc协议。理论知识往往是枯燥无味的,但是等学完了技术再回过头来重新认识的时候,你会有不一样的收获。这个点是面试常问的点,而且如果你正在对java技术或者是其他的技术进阶学习的话,这个知识点也是应该要掌握的。

一、前言回顾


CAP理论指的是一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。比如下面这张图:

v2-32c0d3cef061c9993a8f540917dc3865_1440w.jpg

在这三项当中AP在实际应用中较多,它舍弃了一致性。为什么要舍弃一致性呢?就好比是我们在买火车票的时候,明明看到还有一张票,可是等我选好了座位准备付钱的时候,系统却提示没票了。这就是舍弃了一致性,数据可能是不一致的。但是分区容错性和可用性却得到了满足。


但这不是说一致性不重要,相反恰恰它是最重要的。我们再举个例子,在我们的银行系统中就必须要求数据的一致性,道理你也能明白,对我们来说,我们舍弃的只是强一致性。但是一定要满足最终一致性。也就是说,但是最终也要将数据同步成功来保证数据一致。

BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩 写。BASE理论是对CAP中AP的一个扩展。从上图我们已经能够看出了。


为了实现 BASE 理论,需要在可用性和一致性之间找到一个合适的一致性理论,之前曾经使用过2pc协议,但是这种协议过于保守,会出现很多的问题,因此为了解决2pc协议的缺陷,出现了3pc协议。


二、什么是3pc协议


我们首先来看一下2pc协议是如何保证最终一致性的。

v2-e54a3c03b21782800b9a5234a6db6689_1440w.jpg

也就是说2pc协议主要分为两个阶段:


(1)提交事务请求

(2)执行事务提交

现在我们使用3pc协议来更改一下看看:

v2-5f8ebcab111d2707a6cc10b3cf3d2486_1440w.jpg

也就是说,3PC 将阶段一 "提交事务请求" 分成了2部分,总共形成了 3 个部分:


(1)CanCommit

(2)PreCommit

(3)do Commit


阶段一:CanCommit


(1)事务询问:协调者向参与者发送一个包含事务内容的 canCommit 请求,询问是否可以执行事务提交操作,并等待响应。


(2)各参与者向协调者反馈事务询问的响应,如果参与者认为自己可以顺利执行事务,就返回 Yes,否则反馈 No 响应。


阶段 二:PreCommit


协调者在得到所有参与者的响应之后,会根据结果执行2种操作:执行事务预提交,或者中断事务。


(1)执行事务预提交:


首先协调者向所有参与者节点发出 preCommit 的请求,并等待响应。然后参与者受到 preCommit 请求后,会执行事务操作,并将结果返回。最后协调者得到了Ack响应,确定下一阶段是否为提交或者是终止操作。


(2)中断事务也分为2个步骤:


首先协调者向所有参与者节点发出 abort 请求 。然后参与者如果收到 abort 请求或者超时了,都会中断事务。


阶段三:do Commit


(1)执行提交


首先协调者发送提交请求,并等待Ack 响应。然后参与者收到 doCommit 请求后,执行事务并反馈事务提交结果,向协调者发送 Ack 消息。最后协调者接收 Ack 消息后,完成事务。


(2)中断事务


中断事务是因为出现了异常,比如协调者一方出现了问题,或者是协调者与参与者之间出现了故障。


首先协调者向所有的参与者发送中断请求。然后参与者接收到中断请求后,会利用其在二阶段记录的 undo 信息来执行事务回滚操作,并释放资源。接下来参与者在完成事务回滚之后,向协调者发送 Ack 消息。最后协调者接收到所有的 Ack 消息后,中断事务。


三、3pc协议的优点


3PC对于协调者和参与者都设置了超时时间,而2PC只有协调者才拥有超时机制。这个优化点,避免了参与者在长时间无法与协调者节点通讯(协调者挂掉了)的情况下,无法释放资源的问题。


而且3pc多设置了一个缓冲阶段保证了在最后提交阶段之前各参与节点的状态是一致的。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
75 2
|
6天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
137 2
|
6天前
|
XML 分布式计算 监控
Oozie工作流管理系统设计与实践:面试经验与必备知识点解析
【4月更文挑战第9天】本文详述了Oozie工作流管理系统的核心概念,包括安装配置、Workflow XML、Action、Coordinator和Bundle XML定义。此外,讨论了工作流设计实践,如监控调试、自动化运维,并对比了Oozie与其他工作流工具的差异。文中还分享了面试经验及解决实际项目挑战的方法,同时展望了Oozie的未来发展趋势。通过学习,读者能提升Oozie技术能力,为面试做好充分准备。
33 0
|
6天前
|
数据采集 消息中间件 监控
Flume数据采集系统设计与配置实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入探讨Apache Flume的数据采集系统设计,涵盖Flume Agent、Source、Channel、Sink的核心概念及其配置实战。通过实例展示了文件日志收集、网络数据接收、命令行实时数据捕获等场景。此外,还讨论了Flume与同类工具的对比、实际项目挑战及解决方案,以及未来发展趋势。提供配置示例帮助理解Flume在数据集成、日志收集中的应用,为面试准备提供扎实的理论与实践支持。
39 1
|
6天前
|
存储 分布式计算 大数据
HBase分布式数据库关键技术与实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析了HBase的核心技术,包括数据模型、分布式架构、访问模式和一致性保证,并探讨了其实战应用,如大规模数据存储、实时数据分析及与Hadoop、Spark集成。同时,分享了面试经验,对比了HBase与其他数据库的差异,提出了应对挑战的解决方案,展望了HBase的未来趋势。通过Java API代码示例,帮助读者巩固理解。全面了解和掌握HBase,能为面试和实际工作中的大数据处理提供坚实基础。
55 3
|
6天前
|
消息中间件 监控 大数据
Kafka消息队列架构与应用场景探讨:面试经验与必备知识点解析
【4月更文挑战第9天】本文详尽探讨了Kafka的消息队列架构,包括Broker、Producer、Consumer、Topic和Partition等核心概念,以及消息生产和消费流程。此外,还介绍了Kafka在微服务、实时数据处理、数据管道和数据仓库等场景的应用。针对面试,文章解析了Kafka与传统消息队列的区别、实际项目挑战及解决方案,并展望了Kafka的未来发展趋势。附带Java Producer和Consumer的代码示例,帮助读者巩固技术理解,为面试做好准备。
31 0
|
4天前
|
Java 程序员
Java this关键字详解(3种用法),Java程序员面试必备的知识点
Java this关键字详解(3种用法),Java程序员面试必备的知识点
|
6天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
25 6
|
4天前
|
Java 数据库连接 数据安全/隐私保护
springBoot集成token认证,最全Java面试知识点梳理
springBoot集成token认证,最全Java面试知识点梳理
|
4天前
|
架构师 Java 程序员
2024年这些高频面试知识点最后再发一次,来一份全面的面试宝典练练手
2024年这些高频面试知识点最后再发一次,来一份全面的面试宝典练练手