标准答案

  1. 每个步骤应有明确的成功、失败、超时和已提交状态,并记录执行证据。
  2. 补偿要考虑操作是否可逆、外部副作用是否已发生、重复执行和用户是否需要介入。
  3. 通过编排或事件驱动推进步骤,补偿本身也要幂等、可重试和可审计。
  4. 最终结果应以业务状态和对账为准,不能只看 Saga 编排器是否收到消息。

题目解析

Saga 中每一步已经是本地提交,跨服务不存在一个可以把所有步骤一起回滚的数据库事务。补偿因此是新的业务动作,可能需要发更正通知、退款或人工审核,而不是简单执行反向 SQL。

每个步骤都要记录已受理、已提交、失败、超时和结果未知,并为补偿定义幂等键、重试上限和状态。补偿失败不能让编排器假装整个 Saga 已经结束。

有些动作不可逆或涉及合规、支付和人工决策,不能机械自动补偿。应把可自动处理、需要审批和只能对账的分支明确写入状态机。

常见误区

  • 误区:为每个动作机械写一个反向动作。改正:先判断副作用是否可逆,必要时用更正事件、退款或人工流程表达补偿。
  • 误区:补偿没有状态和幂等。改正:补偿也要保存执行证据、租约、重试和最终结果,避免重复退款或重复通知。
  • 误区:所有失败都自动补偿。改正:区分可自动恢复、需要人工审批和需要对账的业务分支。

作者信息