啥是2PC?在架构设计中有什么用?

开发 架构
当一个事务跨越多个节点时,为了保持事务的原子性与一致性,可行引入一个协调者来统一掌控所有参与者(Participant)的操作结果,而2PC,就是这个思路的一个落地实践。

什么是2PC?

二阶段提交2PC(Two phase Commit)是指,在分布式系统里,为了保证所有节点在进行事务提交时保持一致性的一种协议算法。

为什么要引入2PC?

在分布式系统里,每个节点都可以知晓自己操作的成功或者失败,却无法知道其他节点操作的成功或失败。

因此,当一个事务跨越多个节点时,为了保持事务的原子性与一致性,可行引入一个协调者(Coordinator)来统一掌控所有参与者(Participant)的操作结果,并指示它们是否要把操作结果进行真正的提交(commit)或者回滚(rollback)。

而2PC,就是这个思路的一个落地实践。

两阶段提交,是怎么个两阶段法?

2PC的实施思路可概括为:投票阶段(voting phase)与提交阶段(commit phase):

  • 投票阶段,参与者将操作结果通知协调者;
  • 提交阶段:收到参与者的通知后,协调者再向参与者发出通知,根据反馈情况决定各参与者是否要提交还是回滚。

2PC有什么不足?

答:在算法执行过程中,所有节点都处于阻塞状态,所有节点所持有的资源(例如数据库数据,本地文件等)都处于封锁状态。

典型场景为:

  • 某一个参与者确认之前,所有参与者以及协调者都处于阻塞状态;
  • 在协调者确认之前,所有参与者都处于阻塞状态;

另外,如有协调者或者某个参与者出现了崩溃,为了避免整个算法处于一个完全阻塞状态,往往需要借助超时机制来将算法继续向前推进,总的来说,2PC是一种比较保守的算法。

举个例子:

甲乙丙丁四人要组织一个会议,需要确定会议时间,不妨设甲是协调者,乙丙丁是参与者。

投票阶段:

  • 甲发邮件给乙丙丁,周二十点开会是否有时间;
  • 甲回复有时间;
  • 乙回复有时间;
  • 丙迟迟不回复,此时对于这个活动,甲乙丙均处于阻塞状态,算法无法继续进行;
  • 丙回复有时间(或者没有时间);

提交阶段:

  • 协调者甲将收集到的结果反馈给乙丙丁(什么时候反馈,以及反馈结果如何,在此例中取决于丙的时间与决定);
  • 乙收到;
  • 丙收到;
  • 丁收到;

可以看到,当出现极端情况时,如果不借助超时,整个活动的推进非常的低效。

这么多缺点,那为什么2PC的应用还这么广泛呢?

  • 其一,2PC原理简单,易于实现;
  • 其二,协调者有明确的控制权,而不像paxos算法各节点平等,自选举,自推进,不可控。明确可控在工程系统中相当重要;
  • 其三,能切实地解决微服务架构中,很多本地逻辑与远程数据库,缓存,MQ分布式事务的实际问题;
  • 其四,它是一个非常通用的方案。

因此,它的使用非常广泛。

知其然,知其所以然。

思路比结论更重要。

责任编辑:赵宁宁 来源: 架构师之路
相关推荐

2020-12-08 11:17:41

微内核架构设计

2024-03-26 16:24:46

分布式事务2PC3PC

2019-10-25 09:50:03

网络爬虫蜘蛛Wi-Fi

2021-03-06 23:28:28

2PC3PC模型

2023-03-31 13:31:45

2022-02-16 22:37:00

流式SQLSQL数据库

2021-10-09 13:08:58

C++STLSet

2018-12-26 07:13:02

2024-11-13 06:03:45

架构设计架构系统

2019-05-21 21:15:32

架构架构设计性能优化

2022-05-30 07:34:33

三范式Java

2020-01-02 15:01:27

NginxApache服务器

2017-05-17 14:51:31

DNS架构负载均衡

2021-09-10 07:59:31

中断锁Java多线编程

2020-10-24 11:09:35

Python下划线用法

2020-05-06 10:19:14

2PC3PC分布式事务

2013-05-27 10:58:28

Tumblr架构设计雅虎收购

2020-05-11 10:30:57

2PC分布式协议

2021-01-13 08:49:36

数据库2PC优化

2024-01-26 08:18:03

点赞
收藏

51CTO技术栈公众号