
1) 【一句话结论】:在淘天订单创建的库存与支付扣减场景,推荐采用TCC(Try-Confirm-Cancel)模式。因为业务允许订单创建时短暂不一致(如用户下单后库存未扣减但支付已预留,后续通过补偿机制保证最终一致性),且库存、支付系统响应延迟较大(假设库存系统1-3秒,支付系统2-5秒),TCC通过补偿机制避免2PC的阻塞问题,更适配电商业务。
2) 【原理/概念讲解】:分布式事务的核心是保证多个子系统操作原子性。订单创建时,需同时扣减库存(库存系统)和支付金额(支付系统)。
3) 【对比与适用场景】:
| 特性/场景 | 两阶段提交(2PC) | TCC模式 |
|---|---|---|
| 定义 | 强一致性分布式事务,协调者主导的提交协议 | 业务系统主导的补偿事务,三大阶段 |
| 特性 | 强一致性,协调者阻塞参与者,系统间延迟小(如金融核心系统,延迟<100ms) | 最终一致性,补偿机制,业务系统控制流程 |
| 适用场景 | 系统间延迟小,强一致性要求高(如金融核心交易,资金安全) | 系统间延迟大(如电商库存、支付系统,延迟1-5秒),业务允许短暂不一致(如订单创建后库存未扣减但支付已预留,后续补偿) |
| 注意点 | 协调者故障导致参与者状态不一致;阻塞问题影响性能,订单创建超时 | 补偿逻辑复杂,需保证幂等性;Try阶段需检查资源有效性(如库存是否已被其他订单预留) |
4) 【示例】(伪代码):
订单创建请求:
{
"orderId": "order_123",
"productId": "prod_456",
"quantity": 2,
"paymentAmount": 200
}
业务系统(订单系统)调用库存系统:
# 库存系统 Try 方法
try_stock = stock_service.try_reserve("prod_456", 2) # 预留库存,返回预留ID
if not try_stock.success:
raise Exception("库存不足")
# 支付系统 Try 方法
try_payment = payment_service.try_reserve("order_123", 200) # 预留支付,返回预留ID
if not try_payment.success:
stock_service.cancel_reserve("prod_456", 2) # 回滚库存
raise Exception("支付金额不足")
# 执行 Confirm
confirm_stock = stock_service.confirm_reserve("prod_456", 2) # 扣减库存
confirm_payment = payment_service.confirm_reserve("order_123", 200) # 扣减支付
if not (confirm_stock.success and confirm_payment.success):
# 回滚 Cancel
stock_service.cancel_reserve("prod_456", 2)
payment_service.cancel_reserve("order_123", 200)
raise Exception("扣减失败")
补偿逻辑(例如用户取消订单):
# 订单取消时执行Cancel
cancel_stock = stock_service.cancel_reserve("prod_456", 2, reservation_id=try_stock.reservation_id) # 检查预留ID,避免重复
cancel_payment = payment_service.cancel_reserve("order_123", 200, reservation_id=try_payment.reservation_id)
# 记录补偿日志(幂等检查)
compensation_log.insert(order_id="order_123", action="cancel_stock", status="success")
5) 【面试口播版答案】:
“面试官您好,针对订单创建时库存与支付扣减的分布式事务,我分析如下:首先,业务场景中库存扣减和支付扣减需保证原子性,但系统间可能存在较大延迟(假设库存系统响应1-3秒,支付系统2-5秒)。两阶段提交(2PC)是强一致性方案,但协调者会阻塞参与者,若库存或支付系统响应超时,可能导致订单创建失败或超时,影响用户体验。TCC模式通过Try(预留)、Confirm(执行)、Cancel(回滚)三个阶段,业务系统先预留资源,再决定是否实际扣减,失败时回滚,保证最终一致性。结合淘天业务,比如订单创建时,库存系统预留库存,支付系统预留预付款,若用户取消订单,通过Cancel回滚,既能保证业务流程的原子性,又避免2PC的阻塞问题。因此,推荐采用TCC模式,更适配电商业务中系统间延迟大、允许短暂不一致的场景。”
6) 【追问清单】:
7) 【常见坑/雷区】: