← 每日面试题 学习看板

在微服务架构下,一个业务流可能涉及10个以上的服务调用。如果采用SAGA模式,如何设计“补偿事务”才能避免补偿逻辑本身的复杂性成为新的负担?有没有通用的设计模式或最佳实践?

面试题/02架构设计题/02分布式/02分布式事务/在微服务架构下,一个业务流可能涉及10个以上的服务调用。如果采用SAGA模式,如何设计“补偿事务”才能避免补偿逻辑本身的复杂性成为新的负担?有没有通用的设计模式或最佳实践?.md

完整讲解(权威版)

最后更新:2026-10-23 · 基于第 1 次作答

L1 · 30 秒速记

结论:补偿逻辑的复杂度靠"编排器集中管理 + 补偿幂等 + 补偿可观测"三件事压住,而不是靠业务方各自写补偿。 关键词:编排式 SAGA · 状态机 · 补偿幂等 · 不可逆步骤 边界:不可逆操作(发消息、外部支付)无法补偿,只能靠对账兜底。

L2 · 核心讲解

核心考点定位:能否把"补偿复杂度"拆解为可管理的工程问题,而不是笼统说"没有银弹"。

机制链(≥3 环):

  1. 编排器建模 → 把 10+ 服务调用建成状态机,每个步骤绑定正向操作与补偿操作,编排器是唯一决策者。
  2. 补偿幂等 → 每个补偿操作基于业务单号做幂等,允许重复触发,避免重试造成二次伤害。
  3. 补偿可观测 → 记录每步状态、耗时、失败原因,支持人工介入与重放。
  4. 不可逆步骤隔离 → 发消息、外部支付等不可逆操作放到流程末端,或改为可撤销设计(如延迟发送、可取消订单)。

证据锚点:

对比与权衡:

维度编排式 SAGA协同式 SAGA
控制方式中心编排器各服务事件驱动
补偿逻辑集中管理分散在各服务
可观测性强(单一视图)弱(需链路追踪)
适用规模10+ 服务3-5 服务
耦合度编排器是单点服务间事件耦合

常见误区:

  1. 错误:补偿逻辑越简单越好,所以尽量不写补偿 → 正确:补偿必须写,但要集中管理 → 为什么:没有补偿的 SAGA 在失败时无法收敛。
  2. 错误:所有操作都能补偿 → 正确:发消息、外部支付不可逆 → 为什么:外部系统状态无法回退,只能靠对账。
  3. 错误:协同式 SAGA 更优雅所以优先选 → 正确:10+ 服务必须用编排式 → 为什么:协同式的补偿分散,故障定位和重放成本极高。

适用边界:SAGA 适合长链路、可容忍最终一致的业务流;不适合强一致、需要即时回滚的核心账务(用 TCC)。

延伸追问(≥3)

  1. 10+ 服务的 SAGA,编排器挂了怎么办?
  1. 补偿操作本身失败了怎么办?
  1. 哪些操作应该放到流程末端?

面试者参考回答(400–700 字)

【结论】 面试官您好,补偿逻辑的复杂度不是靠"少写补偿"解决的,而是靠三件事压住:编排器集中管理、补偿幂等、补偿可观测。

【三点】 第一,10 个以上服务必须用编排式 SAGA,而不是协同式。协同式让每个服务自己发事件驱动下一步,补偿逻辑分散在各服务里,故障定位和重放成本极高。编排式由一个中心编排器持有状态机,每个步骤绑定正向操作和补偿操作,编排器是唯一决策者,补偿逻辑集中在一处维护。第二,每个补偿操作必须幂等。补偿会重试,如果不幂等就会重复退款、重复发货。实现方式是基于业务单号建唯一键,重复补偿直接返回上次结果;状态机保证状态只能单向流转,已经是补偿完成状态就不再执行。第三,补偿要可观测。每步的状态、耗时、失败原因都要记录到补偿日志表,支持人工介入和重放。另外,不可逆操作要特殊处理:发消息、外部支付、发短信这些无法回退,要么放到流程末端减少补偿范围,要么改成可撤销设计(延迟发送、可取消订单),实在无法撤销的就靠日终对账兜底。

【边界】 当然,SAGA 本身没有银弹。它适合长链路、可容忍最终一致的业务流;核心账务这种需要即时回滚的场景应该用 TCC。另外编排器是单点,必须做无状态化 + 状态持久化 + 集群部署,否则编排器挂了整条链路就卡住。

面试记录 2026-10-23(第 1 次)

题目:10+ 服务调用下 SAGA 补偿事务如何设计,避免补偿逻辑本身成为负担

难度:high

标签:arch/distributed/transaction, distributed/saga

评分:⭐⭐☆☆☆(2/5)

练习次数:1

我的回答

首先没有什么银弹没有最佳的实践,只有些当前某个场景下合适的场景,saga中能实现多服务之间的调度通过的是抽取统一语义去设定执行方案,通过配置每个服务是如何执行的,每一个服务实现自己的正向和逆向操作,通过saga中执行的状态和配置的逻辑来确认当前服务如何继续执行,如果出现异常,则逐个调用逆向操作进行补偿,来实现事务的回滚,当然也有些不能逆向的,可以在配置中指定,比如已经发出去的消息,无法再追回

点评

评分:⭐⭐☆☆☆(2/5)

优点:

不足:

补充:

完整讲解见上方「完整讲解(权威版)」