面试题答案
一键面试3PC 相比于 2PC 在降低分布式事务成本方面的改进措施
- 引入预询问阶段(CanCommit)
- 在 2PC 中,协调者直接进入准备阶段(PreCommit),而 3PC 增加了预询问阶段。在 CanCommit 阶段,协调者向所有参与者发送 CanCommit 请求,询问参与者是否可以执行事务提交操作。参与者根据自身资源等情况进行检查,如果可以则回复 Yes,否则回复 No。
- 这种方式能在早期发现潜在的无法提交事务的情况,避免像 2PC 那样进入准备阶段后才发现某些参与者无法提交,从而减少不必要的资源锁定时间和网络通信开销。例如,在一个电商系统中,库存服务可能因为库存不足无法参与事务提交,在 3PC 的 CanCommit 阶段就能发现并停止事务流程,而 2PC 可能要到 PreCommit 阶段才发现,浪费了之前的一些资源锁定时间。
- 弱化同步阻塞
- 2PC 的准备阶段(PreCommit)中,参与者在收到 PreCommit 消息后,会锁定资源并等待最终的 Commit 或 Rollback 指令,在此期间处于同步阻塞状态,无法处理其他事务。而在 3PC 的 PreCommit 阶段,如果参与者收到 PreCommit 消息,只有在自身处于“可提交”状态(即 CanCommit 阶段回复 Yes)才会锁定资源。并且在等待最终决策时,如果长时间未收到协调者的指令,参与者可以自行提交事务(在一定规则下)。
- 这样减少了参与者长时间同步阻塞的时间,提高了资源的利用率,降低了事务成本。比如在一个微服务架构的银行转账系统中,涉及多个服务参与事务,若某个服务在 2PC 准备阶段长时间等待协调者指令,其他业务无法使用该服务资源。而 3PC 能在一定程度上缓解这种情况,减少资源被长时间占用的成本。
这些措施提升分布式系统可用性的方式
- 预询问阶段提升可用性
- 由于 CanCommit 阶段能提前排查出无法参与事务的节点,避免事务进入到准备阶段后因部分节点问题导致事务回滚。例如在一个分布式文件存储系统中,如果某些存储节点因为磁盘空间不足等原因无法参与事务提交,在 CanCommit 阶段就能被发现,系统可以及时调整事务策略,如选择其他存储节点或者暂停事务,而不是等到进入准备阶段后再处理,从而保证整个系统的可用性。如果是 2PC,进入准备阶段后才发现问题,可能会导致更多资源浪费和系统短暂的不可用。
- 弱化同步阻塞提升可用性
- 3PC 中参与者在 PreCommit 阶段等待最终指令时,若超时可以自行提交事务(满足一定条件)。这在协调者出现故障等情况下,能避免参与者一直处于阻塞状态,使系统仍能保持部分功能可用。例如在一个分布式订单处理系统中,当协调者与某个订单服务节点网络出现故障时,该订单服务节点在 3PC 的 PreCommit 阶段等待超时后可以自行提交事务,不影响订单处理的整体流程,相比 2PC 中该节点一直阻塞等待协调者指令,系统可用性得到了提升。
实际场景举例
以一个大型电商平台的订单处理为例,订单创建涉及库存扣减、支付处理、物流信息生成等多个分布式服务。 在 2PC 模式下,协调者直接发送准备消息给各服务,库存服务可能因库存不足等原因无法提交,但在收到准备消息时已经锁定了资源。如果之后发现无法提交事务进行回滚,这期间资源被锁定,其他订单相关操作可能受到影响,系统可用性降低。 而在 3PC 模式下,首先进入 CanCommit 阶段,库存服务发现库存不足直接回复 No,事务不会进入 PreCommit 阶段,避免了不必要的资源锁定。若都回复 Yes 进入 PreCommit 阶段,即使协调者出现故障,在一定规则下各服务等待超时后可以自行提交事务,保障订单处理流程的继续进行,提高了整个电商平台分布式系统的可用性,同时也降低了因长时间资源锁定和事务回滚带来的成本。