MST

星途 面试题库

面试题:分布式系统下如何基于TCC模式实现分布式事务的一致性

假设你正在开发一个电商系统,涉及库存扣减、订单创建和支付等多个分布式服务。请描述如何利用TCC(Try - Confirm - Cancel)模式来保证这些操作的分布式事务一致性,包括每个阶段具体要做的操作以及异常处理策略。
41.0万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

Try阶段

  1. 库存扣减服务:尝试预占库存,根据订单商品数量,在库存系统中标记相应数量的库存为预占用状态,而非直接扣减。例如,若订单中有10件商品,库存系统将10件商品标记为预占用,实际库存数量暂时不变。这样做是为了在后续流程出现问题时,能方便回滚库存。
  2. 订单创建服务:尝试创建订单,在订单系统中生成一条状态为“待支付”的订单记录,记录订单的基本信息,如订单编号、用户信息、商品列表等。此时订单仅处于创建阶段,尚未完成整个交易流程。
  3. 支付服务:尝试发起支付预授权,向支付渠道发送支付预授权请求,冻结用户账户中相应的支付金额。例如,订单金额为100元,支付服务向支付渠道请求冻结用户账户中的100元资金,确保后续支付操作时有足够资金。

Confirm阶段

  1. 库存扣减服务:确认扣减库存,将Try阶段预占的库存正式扣减。即从库存数量中减去预占的商品数量,更新库存系统中的库存实际数量。
  2. 订单创建服务:确认订单,将订单状态从“待支付”更新为“已支付”,标志订单交易成功。同时,订单系统可根据业务需求进行后续操作,如通知物流系统准备发货等。
  3. 支付服务:确认支付,向支付渠道发送支付确认指令,完成资金的实际转移,将预授权冻结的资金扣除并转移到商家账户。

Cancel阶段

  1. 库存扣减服务:取消库存预占,将Try阶段预占的库存标记清除,恢复库存到预占前的状态。例如,若预占了10件商品,取消操作后,库存数量增加10件,恢复到原有库存水平。
  2. 订单创建服务:取消订单,删除Try阶段创建的“待支付”订单记录,或者将订单状态更新为“已取消”,并记录取消原因。
  3. 支付服务:取消支付预授权,向支付渠道发送取消预授权指令,解冻用户账户中被冻结的资金,使资金可正常使用。

异常处理策略

  1. Try阶段异常:若在Try阶段某个服务出现异常,如库存不足无法预占库存,应立即触发Cancel阶段操作。调用各服务的Cancel方法,回滚已执行的Try操作,确保各服务状态恢复到事务开始前的状态,避免部分操作成功部分失败导致的数据不一致。
  2. Confirm阶段异常:若Confirm阶段某个服务出现异常,如支付确认失败,需要针对不同服务进行不同处理。对于已经成功确认的服务(如库存已成功扣减、订单已成功确认),可能需要人工介入处理。对于支付服务,可重试支付确认操作一定次数,若多次重试仍失败,可通知相关人员进行手动处理,如联系用户或商家协商解决。同时,对库存扣减服务和订单创建服务,若有必要,可考虑进行逆向操作(如增加库存、取消订单),但需谨慎处理以防止数据混乱。
  3. Cancel阶段异常:若Cancel阶段某个服务出现异常,如库存恢复失败,同样需要人工介入。记录异常信息,通知运维或开发人员进行排查和修复。同时,可考虑对该服务进行重试操作,尝试恢复到正常状态。在重试多次仍失败的情况下,需要根据业务规则和数据一致性要求,制定进一步的处理方案,如通过人工调整库存数据等方式保证数据的一致性。