面试题答案
一键面试3PC 应对网络分区保证一致性的策略
- 阶段一:CanCommit
- 协调者:向所有参与者发送
CanCommit
请求,询问是否可以执行事务操作。 - 参与者:检查自身资源状态等,若可以则回复
Yes
,否则回复No
。若在规定时间内未收到协调者请求或无法响应,参与者默认回复No
。
- 协调者:向所有参与者发送
- 阶段二:PreCommit
- 协调者:若所有参与者都回复
Yes
,则向所有参与者发送PreCommit
请求,告知准备提交事务;若有参与者回复No
或超时,向所有参与者发送Abort
请求。 - 参与者:收到
PreCommit
请求后,锁定资源,记录事务日志,但不提交事务;收到Abort
请求则直接中断事务。若在规定时间内未收到协调者指令,参与者根据第一阶段回复决定,若第一阶段回复Yes
则进入PreCommit
状态等待超时,若回复No
则中断事务。
- 协调者:若所有参与者都回复
- 阶段三:DoCommit
- 协调者:在
PreCommit
阶段收到所有参与者Ack
响应后,向所有参与者发送DoCommit
请求进行事务提交;若有参与者未响应或响应超时,向所有参与者发送Abort
请求回滚事务。 - 参与者:收到
DoCommit
请求后提交事务;收到Abort
请求回滚事务。若在规定时间内未收到协调者指令,处于PreCommit
状态且已等待超时的参与者会提交事务,因为大概率协调者正常且其他参与者已准备好提交,这是为了避免长时间阻塞。
- 协调者:在
可能面临的挑战
- 脑裂问题:网络分区后,不同分区内的协调者和参与者可能做出不同决策。例如,一个分区内协调者认为所有参与者准备好提交并发送
DoCommit
,而另一个分区协调者因部分参与者未响应而发送Abort
,导致数据不一致。 - 同步阻塞:在等待协调者指令过程中,参与者资源被锁定,可能造成长时间阻塞,影响系统并发性能。
- 超时机制依赖:依赖准确的超时时间设置,若超时时间过短,可能导致不必要的事务回滚;若过长,会延长资源锁定时间和阻塞时间。
- 协调者单点问题:尽管 3PC 比 2PC 有所改进,但协调者依然是关键节点,若协调者在某些阶段故障且未及时恢复,可能导致事务无法按预期推进,影响一致性。