MST

星途 面试题库

面试题:分布式系统中3PC相较于2PC在提高事务可靠性方面有哪些关键改进

请阐述3PC(三阶段提交协议)相比于2PC(两阶段提交协议),在提高分布式事务可靠性方面具体做出了哪些改进,这些改进是如何降低系统因节点故障或网络分区等异常情况导致事务不一致风险的。
36.0万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

1. 改进点

  • 引入预询问阶段:2PC直接进入准备阶段,而3PC在准备阶段前增加了CanCommit阶段。协调者先向参与者发送CanCommit请求,询问参与者是否可以执行事务操作。参与者根据自身资源等情况回复Yes或No。这使得协调者在正式进入事务操作前,就能初步知晓各参与者的状态,避免在参与者可能无法执行事务的情况下,仍进入后续复杂且可能造成资源浪费的准备和提交阶段。
  • 增加超时机制:在2PC中,若协调者发生故障,参与者可能会长时间处于阻塞状态,等待协调者指令,易造成事务悬而不决。3PC中,无论是参与者还是协调者,都设置了超时机制。例如,参与者在等待协调者指令超过一定时间后,会自动进行相应处理(如中断事务);协调者在等待参与者响应超过一定时间,也会做出处理,避免因等待时间过长导致事务无法推进。
  • 细化阶段:3PC将2PC的提交阶段拆分为PreCommit和DoCommit阶段。PreCommit阶段,协调者向参与者发送PreCommit请求,参与者收到后执行事务操作并锁定资源。只有当所有参与者都响应Ack后,协调者才进入DoCommit阶段,向参与者发送DoCommit请求让其正式提交事务。这样细化的阶段,使得事务提交过程更为稳健,降低因单个节点异常影响整体事务提交的风险。

2. 降低事务不一致风险的方式

  • 针对节点故障
    • 预询问阶段作用:若在CanCommit阶段有节点故障无法响应,协调者可根据其他响应结果决定是否继续事务,避免在有节点可能无法完成事务的情况下进入后续阶段,从而降低因故障节点导致事务不一致的风险。例如,若大部分节点回复No,协调者可直接放弃事务,无需等待故障节点恢复。
    • 超时机制作用:若在PreCommit或DoCommit阶段,协调者发生故障,参与者因设置了超时机制,不会无限期等待,而是在超时后进行中断事务等操作,避免事务长时间悬而不决造成不一致。同时,若参与者故障,协调者等待超时也会做出相应处理,不会一直等待故障节点,减少了不一致风险。
    • 细化阶段作用:在PreCommit阶段,即使部分参与者故障,只要未进入DoCommit阶段,已执行事务操作的参与者可回滚事务,待故障节点恢复后重新尝试事务,而不是像2PC那样可能因故障节点影响而导致整个事务状态混乱,降低了不一致性。
  • 针对网络分区
    • 预询问阶段作用:由于在CanCommit阶段就初步确认了参与者状态,若在后续阶段发生网络分区,协调者可根据CanCommit阶段的结果及当前分区内节点情况,做出合理决策。例如,若网络分区后,部分分区内节点在CanCommit阶段回复No,协调者可决定放弃事务,避免不同分区节点执行不同事务操作导致不一致。
    • 超时机制作用:在网络分区情况下,无论是协调者还是参与者,若等待对方响应超时,都能按超时机制进行处理,不会因网络问题长时间等待,降低了因网络分区导致事务不一致的风险。例如,参与者在网络分区内等待协调者指令超时,可中断事务,避免与其他分区节点事务状态不一致。
    • 细化阶段作用:即使在网络分区时,由于PreCommit和DoCommit阶段的存在,使得事务状态更为清晰。例如,在PreCommit阶段发生网络分区,各分区内参与者执行事务操作但未提交,待网络恢复后,协调者可根据各分区情况进行统一协调,决定是否进入DoCommit阶段,从而减少事务不一致的可能性。