MST

星途 面试题库

面试题:微服务架构下的分布式事务处理策略

当多个微服务之间涉及到数据一致性操作,形成分布式事务时,通常有哪些处理策略?请详细说明每种策略的原理、优缺点以及在实际项目中的应用案例。
32.6万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

1. 两阶段提交(2PC)

  • 原理
    • 准备阶段(投票阶段):协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待所有参与者回复。参与者执行事务操作,但不提交,然后向协调者反馈“同意”或“不同意”。
    • 提交阶段(执行阶段):如果所有参与者都回复“同意”,协调者向所有参与者发送“提交”指令,参与者收到后正式提交事务;如果有任何一个参与者回复“不同意”,协调者向所有参与者发送“回滚”指令,参与者回滚事务。
  • 优点
    • 简单,能保证强一致性。
  • 缺点
    • 性能问题:所有参与者在准备阶段都处于锁定资源状态,直到提交阶段结束,期间资源无法释放,影响系统并发性能。
    • 单点故障:协调者一旦出现故障,整个分布式事务会处于不确定状态,可能导致数据不一致。
    • 数据不一致风险:在提交阶段,如果部分参与者收到“提交”指令,而部分未收到(网络问题等),会导致数据不一致。
  • 应用案例:传统银行转账场景,例如跨行转账,银行系统内部不同子系统之间的转账操作,对数据一致性要求极高,可使用2PC保证转账的原子性。

2. 三阶段提交(3PC)

  • 原理
    • 询问阶段:协调者向参与者发送包含事务内容的询问,询问是否可以执行事务操作,参与者回复“可以”或“不可以”。此阶段参与者并不锁定资源。
    • 准备阶段:如果所有参与者都回复“可以”,协调者向参与者发送预提交指令,参与者执行事务操作但不提交,并回复“准备好”。
    • 提交阶段:协调者收到所有参与者“准备好”回复后,向参与者发送“提交”指令,参与者正式提交事务;若在询问或准备阶段有参与者回复否定信息,协调者发送“回滚”指令,参与者回滚事务。
  • 优点
    • 相较于2PC,减少了资源锁定时间,提高了并发性能。因为在询问阶段不锁定资源。
    • 降低了单点故障影响,引入了超时机制,当协调者故障时,参与者不会一直阻塞等待。
  • 缺点
    • 实现复杂,比2PC增加了一个阶段,网络通信开销增大。
    • 仍然存在数据不一致风险,虽然概率比2PC低,但在极端网络情况下仍可能出现。
  • 应用案例:适用于对并发性能有一定要求,且对数据一致性要求较高的分布式系统,如某些金融交易系统的部分模块,在保证数据准确的同时希望提升系统并发处理能力。

3. 柔性事务(TCC - Try - Confirm - Cancel)

  • 原理
    • Try阶段:主要是对业务系统资源进行检测和预留,完成所有业务检查(一致性),预留必须业务资源(准隔离性)。
    • Confirm阶段:真正执行业务提交,使用Try阶段预留的资源完成操作,要求幂等性,即多次执行结果一致。
    • Cancel阶段:若Try阶段执行成功,但Confirm阶段执行失败,执行Cancel操作,释放Try阶段预留的资源,同样要求幂等性。
  • 优点
    • 对应用侵入性低,通过业务逻辑实现事务控制,不依赖数据库底层事务机制。
    • 并发性能好,资源锁定时间短,仅在Try阶段短暂锁定资源。
  • 缺点
    • 实现复杂,需要业务开发人员自己实现Try、Confirm、Cancel三个操作,对业务理解要求高。
    • 幂等性实现有难度,需要额外设计和处理。
  • 应用案例:电商系统的订单支付场景,在支付时,Try阶段检查库存、冻结支付金额等;Confirm阶段完成实际支付和库存扣减;若支付异常,Cancel阶段解冻金额、恢复库存。

4. 本地消息表(异步确保型)

  • 原理
    • 在本地事务中,业务操作与消息发送放在同一个事务中,确保消息一定会被发送。消息表记录要发送的消息内容及状态。
    • 消息发送成功后,修改消息状态为“已发送”。接收方消费消息并处理业务,处理成功后通知发送方,发送方更新消息状态为“已处理”。
    • 有定时任务扫描消息表中“已发送”但未“已处理”的消息,重新发送,直到处理成功。
  • 优点
    • 实现简单,依托本地事务保证消息发送的可靠性。
    • 对业务耦合度相对较低,通过消息队列解耦不同微服务。
  • 缺点
    • 消息表增加了数据库存储和维护成本。
    • 数据一致性是最终一致性,不是强一致性。
    • 依赖定时任务重试,可能出现消息重复消费问题,需要接收方实现幂等处理。
  • 应用案例:订单系统与库存系统之间,订单创建成功后,在订单库的消息表记录库存扣减消息,发送到消息队列,库存系统消费消息扣减库存,若处理失败,订单系统定时任务重试发送消息。

5. 可靠消息最终一致性(事务消息)

  • 原理
    • 以RocketMQ为例,生产者发送半消息(Half Message)到MQ,此时消息对消费者不可见。
    • 生产者执行本地事务,根据事务执行结果向MQ发送Commit或Rollback指令。
    • MQ收到Commit指令后,将消息变为可消费状态,消费者消费消息并执行本地业务,若消费失败,MQ提供重试机制。
  • 优点
    • 保证最终一致性,借助MQ的事务机制实现。
    • 对业务侵入性较小,主要依赖MQ功能实现事务控制。
    • 异步处理,提高系统整体吞吐量。
  • 缺点
    • 依赖MQ实现事务功能,若MQ出现故障,会影响事务处理。
    • 不同MQ对事务消息支持程度不同,存在兼容性问题。
  • 应用案例:电商系统中订单创建与物流系统下单关联,订单创建成功后,通过事务消息通知物流系统创建物流单,确保订单与物流单状态最终一致。