面试题答案
一键面试策略和技术手段
- 两阶段提交(2PC)
- 原理:分为准备阶段和提交阶段。在准备阶段,协调者向所有参与者发送事务预执行请求,参与者执行事务但不提交;在提交阶段,若所有参与者准备成功,协调者发送提交请求,否则发送回滚请求。
- 优化:可以通过优化网络通信,减少等待时间。例如,使用异步通信方式,让参与者在准备完成后尽快返回响应。
- 一致性保证:强一致性,所有参与者要么都提交,要么都回滚。
- 三阶段提交(3PC)
- 原理:在2PC基础上增加了一个询问阶段,协调者先询问参与者是否可以执行事务,参与者回复可以后进入准备阶段,之后是提交阶段。
- 优化:引入超时机制,避免协调者单点故障导致参与者一直阻塞。例如,若协调者在询问阶段超时未收到所有参与者回复,可自动进入回滚流程。
- 一致性保证:相比2PC,在一定程度上提高了容错性,最终达到强一致性。
- TCC(Try - Confirm - Cancel)
- 原理:业务逻辑分为Try(预留资源)、Confirm(确认提交)、Cancel(取消操作释放资源)三个阶段。Try阶段完成所有业务检查和资源预留,Confirm阶段真正提交事务,若Try失败则执行Cancel。
- 优化:通过将大事务拆分为多个小操作,减少资源锁定时间。例如,在订单和库存业务中,Try阶段先检查库存并锁定库存,Confirm阶段再真正扣减库存。
- 一致性保证:最终一致性,通过Confirm和Cancel的补偿操作确保数据一致性。
- 消息队列(MQ)
- 原理:将事务消息发送到MQ,接收方消费消息后执行相应业务逻辑。例如,订单生成后发送消息到MQ,库存服务消费消息扣减库存。
- 优化:采用可靠的消息队列,确保消息不丢失、不重复。例如,RocketMQ支持事务消息,可保证消息的最终一致性。
- 一致性保证:最终一致性,通过消息重试和补偿机制保证数据一致性。
- 本地事务 + 消息表
- 原理:在本地数据库中创建消息表,业务操作和消息记录在同一个本地事务中。操作完成后将消息发送到MQ,接收方消费消息。
- 优化:通过异步处理消息,提高系统响应速度。例如,订单系统本地事务完成后异步发送消息到MQ,库存系统异步消费。
- 一致性保证:最终一致性,通过消息表的重试机制保证消息可靠发送和处理。
不同业务场景适用性
- 订单创建与支付
- 2PC/3PC:适用于对一致性要求极高,订单金额较大,且系统参与者较少、网络稳定的场景。例如,企业级电商对大客户的订单处理,因为涉及金额大,不容许数据不一致。
- TCC:适用于业务逻辑相对复杂,需要更多业务自定义补偿逻辑的场景。如涉及多种支付方式组合的订单,TCC可自定义不同支付方式的Try、Confirm和Cancel逻辑。
- MQ/本地事务 + 消息表:适用于对一致性要求最终一致,且订单量较大的场景。如普通电商的日常订单处理,通过消息重试和补偿机制可保证最终库存和订单状态一致。
- 库存扣减
- 2PC/3PC:当库存数据准确性要求极高,且库存操作涉及的系统较少时适用。例如,高价值商品的库存扣减,不允许出现库存超卖情况。
- TCC:对于库存扣减存在复杂业务规则,如不同仓库库存分配的场景适用。TCC可在Try阶段分配库存,Confirm阶段真正扣减。
- MQ/本地事务 + 消息表:适合高并发的普通商品库存扣减场景。通过消息队列异步处理库存扣减,可提高系统并发处理能力,且最终保证库存一致性。