
1) 【一句话结论】:保证订单、库存、支付的一致性,强一致性方案(如2PC)通过协调者与参与者协作确保原子性,但可能阻塞;最终一致性方案(如Saga)通过本地事务与补偿机制保证最终状态正确,适合分布式系统,但需处理补偿延迟与幂等性。
2) 【原理/概念讲解】:
解释两阶段提交(2PC):
解释最终一致性(以Saga模式为例):
3) 【对比与适用场景】:
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 两阶段提交(2PC) | 强一致性分布式事务协议,协调者与参与者协作,保证事务原子性 | 强一致性,阻塞式,协调者故障导致阻塞 | 强一致性要求高(如金融交易,但实际分布式系统中协调者故障风险高) | 协调者故障时参与者阻塞,需故障转移;可能因阻塞导致性能下降 |
| Saga | 最终一致性模式,通过一系列本地事务与补偿机制保证最终状态正确 | 最终一致性,非阻塞,通过补偿恢复 | 分布式系统(如社交平台红包、订单系统),业务逻辑复杂,需异步处理 | 补偿服务需幂等;可能存在多次补偿延迟;步骤失败后需正确调用补偿 |
4) 【示例】:
2PC示例(伪代码):
用户发红包请求:订单服务(OrderService)创建订单(order_id=1),库存服务(StockService)扣减库存(扣减10个),支付服务(PaymentService)扣款(扣减10元)。
协调者收到请求,发送Pre-Commit:
# 协调者发送Pre-Commit
for participant in [order, stock, payment]:
participant.prepare()
所有参与者回复Yes:
# 参与者回复
stock: "可以"
payment: "可以"
协调者发送Commit:
# 协调者发送Commit
for participant in [order, stock, payment]:
participant.commit()
若库存服务回复No:
# 协调者发送Abort
for participant in [order, stock, payment]:
participant.abort()
Saga示例(伪代码):
订单服务创建订单(本地事务):
order.create(order_id=1, amount=10)
库存服务扣减库存(本地事务):
stock.deduct(10)
支付服务扣款(本地事务):
payment.charge(10)
若库存扣减失败,调用补偿服务增加库存:
stock.compensate(10)
若支付扣款失败,调用补偿服务退款:
payment.refund(10)
5) 【面试口播版答案】:
面试官您好,针对用户发红包时订单、库存、支付的一致性问题,核心是保证分布式事务的原子性。首先,强一致性方案比如两阶段提交(2PC),通过协调者和参与者协作,准备阶段确认所有参与者可以执行,提交阶段执行或回滚,适合强一致性要求高的场景,但可能因阻塞导致性能问题。然后,最终一致性方案比如Saga模式,通过一系列本地事务,每个步骤成功则继续,失败则补偿,比如库存扣减失败后调用补偿服务增加库存,支付扣款失败后调用补偿服务退款,适合分布式系统,但可能存在多次补偿的延迟。总结来说,2PC保证强一致性但可能阻塞,Saga保证最终一致性但需补偿机制,选择取决于业务对一致性和性能的要求。
6) 【追问清单】:
7) 【常见坑/雷区】: