知识卡片

分布式系统的三种异常处理策略:忽略、重试、补偿

结构图卡 · 2164

内容

分布式系统通常无法依赖两段式提交保证一致输出,因此像咖啡店一样采用三种错误处理策略。”忽略”:什么都不做,适用于出错损失很小、建立纠错机制成本反而更高的场景(如互联网公司忽略记账小错误,定期跑对账程序清理)。”重试”:适用于间歇性错误(如临时通信故障),若所有组件幂等(多次接收同一命令不会重复执行),重试会更简单,因为幂等组件会自动忽略重复命令。”补偿操作”:通过回滚已完成的操作让系统恢复到操作前状态,尤其适合资金交易场景(如扣款后原路退回),但并非所有操作都可逆(如香肠制作)。三者的选择取决于错误代价、是否幂等、操作是否可逆这三个条件。

结构图:

flowchart TD
  E["出现错误"] --> Q1{"错误代价是否很小?"}
  Q1 -->|是| I["忽略:什么都不做"]
  Q1 -->|否| Q2{"错误是否间歇性且组件幂等?"}
  Q2 -->|是| R["重试:幂等组件自动去重"]
  Q2 -->|否| Q3{"操作是否可逆?"}
  Q3 -->|是| C["补偿操作:回滚到操作前状态"]
  Q3 -->|否| X["需要其他专门设计"]

参考来源

- 位置:《架构师应该知道的37件事》第2章《架构》之"2.1 咖啡店不使用两段式提交法"·"2.1.3 异常处理"(源文件:_epub-src/OEBPS/Text/chapter002.html) - 结论依据:原文分别说明忽略适用于"出错导致的损失很小,建立一套错误纠正机制的成本很可能会比简单地放弃处理更高",重试依赖"如果所有组件都是幂等的……你可以简单地重新触发所有操作",补偿操作"通过回滚截至出错时已经完成的操作,让系统回到这组操作发生前的状态……无法采取补偿操作的典型例子是香肠制作",直接支撑本卡结构图。 - 原始内容:如果咖啡店无法制作出让你满意的咖啡,他们就会退款,让你的钱包回到原来的状态。