MST

星途 面试题库

面试题:在分布式系统中,如何在高并发场景下平衡分布式事务的性能与数据一致性?

假设你负责一个高并发的电商分布式系统,在处理订单、库存等业务时需要保证数据一致性。请描述你会采取哪些策略和技术手段来优化分布式事务的执行效率,同时确保数据的强一致性或最终一致性,并且分析这些策略在不同业务场景下的适用性。
34.5万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

策略和技术手段

  1. 两阶段提交(2PC)
    • 原理:分为准备阶段和提交阶段。在准备阶段,协调者向所有参与者发送事务预执行请求,参与者执行事务但不提交;在提交阶段,若所有参与者准备成功,协调者发送提交请求,否则发送回滚请求。
    • 优化:可以通过优化网络通信,减少等待时间。例如,使用异步通信方式,让参与者在准备完成后尽快返回响应。
    • 一致性保证:强一致性,所有参与者要么都提交,要么都回滚。
  2. 三阶段提交(3PC)
    • 原理:在2PC基础上增加了一个询问阶段,协调者先询问参与者是否可以执行事务,参与者回复可以后进入准备阶段,之后是提交阶段。
    • 优化:引入超时机制,避免协调者单点故障导致参与者一直阻塞。例如,若协调者在询问阶段超时未收到所有参与者回复,可自动进入回滚流程。
    • 一致性保证:相比2PC,在一定程度上提高了容错性,最终达到强一致性。
  3. TCC(Try - Confirm - Cancel)
    • 原理:业务逻辑分为Try(预留资源)、Confirm(确认提交)、Cancel(取消操作释放资源)三个阶段。Try阶段完成所有业务检查和资源预留,Confirm阶段真正提交事务,若Try失败则执行Cancel。
    • 优化:通过将大事务拆分为多个小操作,减少资源锁定时间。例如,在订单和库存业务中,Try阶段先检查库存并锁定库存,Confirm阶段再真正扣减库存。
    • 一致性保证:最终一致性,通过Confirm和Cancel的补偿操作确保数据一致性。
  4. 消息队列(MQ)
    • 原理:将事务消息发送到MQ,接收方消费消息后执行相应业务逻辑。例如,订单生成后发送消息到MQ,库存服务消费消息扣减库存。
    • 优化:采用可靠的消息队列,确保消息不丢失、不重复。例如,RocketMQ支持事务消息,可保证消息的最终一致性。
    • 一致性保证:最终一致性,通过消息重试和补偿机制保证数据一致性。
  5. 本地事务 + 消息表
    • 原理:在本地数据库中创建消息表,业务操作和消息记录在同一个本地事务中。操作完成后将消息发送到MQ,接收方消费消息。
    • 优化:通过异步处理消息,提高系统响应速度。例如,订单系统本地事务完成后异步发送消息到MQ,库存系统异步消费。
    • 一致性保证:最终一致性,通过消息表的重试机制保证消息可靠发送和处理。

不同业务场景适用性

  1. 订单创建与支付
    • 2PC/3PC:适用于对一致性要求极高,订单金额较大,且系统参与者较少、网络稳定的场景。例如,企业级电商对大客户的订单处理,因为涉及金额大,不容许数据不一致。
    • TCC:适用于业务逻辑相对复杂,需要更多业务自定义补偿逻辑的场景。如涉及多种支付方式组合的订单,TCC可自定义不同支付方式的Try、Confirm和Cancel逻辑。
    • MQ/本地事务 + 消息表:适用于对一致性要求最终一致,且订单量较大的场景。如普通电商的日常订单处理,通过消息重试和补偿机制可保证最终库存和订单状态一致。
  2. 库存扣减
    • 2PC/3PC:当库存数据准确性要求极高,且库存操作涉及的系统较少时适用。例如,高价值商品的库存扣减,不允许出现库存超卖情况。
    • TCC:对于库存扣减存在复杂业务规则,如不同仓库库存分配的场景适用。TCC可在Try阶段分配库存,Confirm阶段真正扣减。
    • MQ/本地事务 + 消息表:适合高并发的普通商品库存扣减场景。通过消息队列异步处理库存扣减,可提高系统并发处理能力,且最终保证库存一致性。