面试题答案
一键面试可能出现的数据不一致情况
- 协调者与参与者分区:
- 情况:协调者在一个分区,部分参与者在另一个分区。协调者发出准备(PREPARE)消息后,处于另一个分区的参与者无法收到,导致无法统一进入提交(COMMIT)或回滚(ROLLBACK)阶段。若协调者认为所有参与者都准备成功而发出提交消息,而处于另一分区的参与者未收到,就会出现数据不一致,一边已提交事务,另一边还未处理。
- 示例:假设银行转账事务,协调者通知部分银行网点准备转账成功,准备提交,但另一部分网点因网络分区未收到准备消息,后续协调者提交,已收到准备消息的网点转账成功,未收到的则维持原状。
- 参与者之间分区:
- 情况:所有参与者和协调者都在不同分区。协调者发出准备消息,部分参与者收到并回复准备成功,另一部分因网络分区未收到,协调者可能在超时后回滚事务,但已准备成功的参与者可能已将数据持久化到本地,从而导致数据不一致。
- 示例:电商系统中,库存扣减和订单创建分属不同参与者,库存扣减参与者收到准备消息并准备成功,订单创建参与者因网络分区未收到,协调者回滚,库存已扣减但订单未创建。
应对策略及其优缺点
- 引入超时机制:
- 策略:协调者和参与者都设置超时时间。若在一定时间内未收到对方消息(如协调者未收到所有参与者的准备响应,或参与者未收到协调者的提交/回滚消息),则主动进行回滚操作。
- 优点:简单易实现,能在一定程度上避免因网络延迟或分区导致的长时间等待,快速处理可能出现的不一致情况。
- 缺点:可能误判,比如网络短暂故障但未真正分区,超时后回滚事务,影响系统性能和可用性。若超时时间设置不合理,可能频繁回滚正常事务,或等待过久无法及时处理不一致。
- 使用分布式日志:
- 策略:每个参与者和协调者都维护一个分布式日志,记录事务的各个阶段(如准备、提交、回滚)。当网络分区恢复后,通过比对日志来恢复事务状态,确保数据一致性。
- 优点:能更准确地恢复事务状态,即使网络分区期间各节点操作不一致,通过日志比对也能最终达成一致,提高数据一致性的可靠性。
- 缺点:增加系统复杂度,需要额外的存储和管理日志的开销。日志的同步和比对过程也可能出现新的问题,如日志损坏、丢失等,需要复杂的容错机制。
- 多副本与选举机制:
- 策略:为协调者设置多个副本,当出现网络分区时,各分区内的节点重新选举新的协调者。新协调者根据本分区内参与者的状态进行事务处理,并与其他分区协调恢复一致性。
- 优点:提高系统的可用性,在网络分区情况下仍能继续处理事务。通过选举新协调者,能根据当前分区状态做出更合适的决策,减少数据不一致的可能性。
- 缺点:选举机制本身需要复杂的算法,可能出现脑裂等问题,导致多个分区各自处理事务,最终数据不一致。同时,多副本增加了系统的存储和同步开销。