面试题答案
一键面试3PC各阶段网络分区安全风险
- CanCommit阶段
- 协调者无法收到所有参与者响应:网络分区可能导致部分参与者的响应无法及时送达协调者,协调者若等待超时,可能过早判定失败从而终止事务,导致本可成功提交的事务被误终止。
- 参与者收到请求但无法反馈:参与者因网络分区无法向协调者发送响应,协调者会等待超时并认为参与者拒绝,导致事务不必要的回滚。
- PreCommit阶段
- 协调者发送的PreCommit指令部分参与者未收到:收到指令的参与者进入准备状态,而未收到的参与者保持初始状态,形成数据不一致。
- 参与者准备成功但确认消息无法送达协调者:协调者无法确定所有参与者是否准备成功,可能做出错误决策,如误判为所有参与者准备失败而发起回滚,或误判为成功而进入最终提交阶段,导致数据不一致。
- DoCommit阶段
- 协调者发送的DoCommit指令部分参与者未收到:收到指令的参与者提交事务,未收到的参与者不提交,造成数据不一致。
- 参与者提交成功但确认消息无法送达协调者:协调者无法确认所有参与者是否成功提交,若错误判断,可能会对已提交的事务进行不必要的回滚操作。
3PC针对网络分区的安全应对策略
- 引入超时机制:协调者和参与者都设置超时时间,避免无限等待。例如在CanCommit阶段,协调者等待参与者响应超时时,可以做出相应决策,减少事务悬而未决的时间。
- 多轮交互确认:通过三个阶段的多次交互,增加确认信息的机会。即使某个阶段部分消息丢失,后续阶段仍有机会进行弥补和确认,一定程度上降低网络分区造成的不一致风险。
- 参与者状态持久化:参与者将事务相关状态持久化存储,如在PreCommit阶段准备成功后记录状态。当网络恢复后,可依据持久化状态进行相应处理,避免因网络分区导致的状态丢失和数据不一致。