面试题答案
一键面试两阶段提交(2PC)
- 处理方法:
- 准备阶段:协调者向所有参与事务的分片节点发送准备消息,每个分片节点执行事务操作,并将Undo和Redo信息记录到日志中,但不提交事务。然后向协调者反馈操作结果,成功则返回“就绪”,失败则返回“失败”。
- 提交阶段:如果协调者收到所有分片节点的“就绪”反馈,就向所有节点发送提交消息,各节点收到后正式提交事务;若有任何一个节点返回“失败”,协调者向所有节点发送回滚消息,各节点根据日志中的Undo信息回滚事务。
- 优点:
- 原理简单,实现相对容易,能保证强一致性。
- 广泛应用,很多数据库都有对其的支持。
- 缺点:
- 单点故障:协调者一旦出现故障,整个事务流程会被阻塞。比如协调者在发送提交消息前崩溃,部分节点可能一直等待无法完成事务。
- 同步阻塞:在整个2PC过程中,所有参与节点在等待协调者指令期间都处于阻塞状态,无法进行其他操作,资源利用率低。
- 性能问题:需要多次网络交互,尤其是在节点众多、网络状况不佳时,性能会受很大影响。
三阶段提交(3PC)
- 处理方法:
- 询问阶段:协调者向所有分片节点发送询问消息,询问节点是否可以执行事务操作,节点检查自身状态,如资源是否充足等,然后回复协调者“可以”或“不可以”。
- 准备阶段:若协调者收到所有节点的“可以”回复,向所有节点发送准备消息,节点执行事务操作并记录日志,然后反馈“就绪”或“失败”。
- 提交阶段:协调者若收到所有节点“就绪”反馈,发送提交消息让节点提交事务;若有节点反馈“失败”或等待超时,发送中止消息让节点回滚事务。并且增加了超时机制,在每个阶段如果等待超时,节点会自动进行相应操作,如在准备阶段等待超时,节点自动回滚事务。
- 优点:
- 相比2PC,通过引入超时机制和预询问阶段,减少了单点故障导致的事务阻塞问题,一定程度上提高了系统的容错性。
- 减少了同步阻塞时间,在一定程度上提升了系统的并发性能。
- 缺点:
- 实现复杂度较高,需要更多的状态管理和消息交互。
- 虽然减少了阻塞,但仍然存在协调者故障导致不一致的风险,比如在提交阶段协调者故障且部分节点已收到提交消息并提交,部分未收到,就会出现数据不一致。
基于消息队列的最终一致性方案
- 处理方法:
- 将跨片事务操作分解为多个本地事务,并通过消息队列进行异步解耦。例如,在一个涉及多个分片的转账操作中,先在本地分片中完成账户余额的调整等操作,然后将操作结果封装成消息发送到消息队列。其他分片的服务从消息队列中消费消息,并根据消息内容完成相应的事务操作。同时通过一些补偿机制,如定期检查消息处理状态,对未成功处理的消息进行重试等,来保证最终一致性。
- 优点:
- 高并发性能好,通过异步处理,减少了事务操作之间的阻塞,能提升系统整体的吞吐量。
- 解耦性强,各个分片的事务处理相对独立,降低了系统模块之间的耦合度,易于维护和扩展。
- 容错性较好,消息队列一般具有持久化和重试机制,部分节点故障时,消息不会丢失,可后续重试处理。
- 缺点:
- 不保证强一致性,存在数据不一致的窗口期,在业务对一致性要求极高的场景下不太适用。
- 实现复杂度较高,需要处理消息的顺序性、重复消费、消息丢失等问题,同时还需要设计合理的补偿机制。