跳到主要内容
约 4 分钟2 张卡

分布式流程恢复

分布式流程恢复结合重试、对账和受控修复。本文负责业务标识、恢复状态和差异处理。

1. 面试核心​

先记住这几条,再读正文
  • 稳定业务标识。 稳定业务 ID 让重试、重放和人工补单识别同一动作。
  • 请求意图。 幂等键绑定请求意图,同键异参应返回冲突。卡 · 幂等键的语义与生命周期
  • 状态转换。 状态机用条件转换拒绝迟到消息覆盖合法终态。
  • 对账发现。 对账比较权威数据与目标结果,发现静默差异。卡 · 综合题
  • 受控修复。 人工修复复用业务校验与幂等机制,并保留审计。

2. 稳定业务标识​

全局流程 ID、步骤 ID 与支付单号首次创建后保持稳定。事件 ID 标识同一事实的重复投递。重试时使用原 ID,新的业务动作使用新 ID。

本地幂等记录与业务变化共同提交。唯一约束或条件转换限制重复效果。短期缓存标记只覆盖其有效窗口。

2.1 幂等键的语义与生命周期​

幂等键应带租户或调用方范围。服务保存请求摘要、处理状态和最终结果。同键同参重复到达时返回原结果。同键异参说明意图冲突,应返回明确错误。

处理中记录可返回处理中,或等待已有执行结果。服务恢复时根据持久状态继续执行。独立外部副作用还需对方的幂等协议。

保留期需要覆盖重试、死信重放和人工补单。过期后若仍接受旧请求,应能从业务唯一记录识别它。否则要拒绝过期请求,并走专门修复流程。

3. 状态机​

订单可从 PENDING 进入 PAID 或 CANCELLED。迟到支付通知遇到 CANCELLED 时,应进入核对或退款分支。它只提供支付事实,不直接覆盖订单终态。

SQL 以版本或当前状态作为条件。影响 0 行时,读取状态区分已完成、过期和非法转换。

4. 错误分类与重试​

暂时性网络失败和限流可有限退避重试。参数错误、账号冻结或结构不兼容需修复输入。

外部结果未知时,先查询原业务 ID。对方支持幂等重试时,也可沿用原键重试。步骤记录尝试次数、下次时间和最后错误。达到上限后转入明确待处理状态。

5. 对账​

对账先明确每类事实的权威来源。支付渠道流水说明外部扣款结果。内部账务说明已登记的资金变化。搜索索引则是数据库的派生结果。

核对使用主键、金额、版本和状态。只比总数会让一条多和一条少相互抵消。关键业务需下钻到具体差异记录。

6. 增量扫描​

增量任务记录扫描范围、游标和检查点。按更新时间扫描时,使用时间与主键组成稳定顺序。相同时间戳和延迟提交需通过重叠窗口补查。

重叠窗口仍有范围边界。周期全量核对用于发现长期遗漏。修复任务本身也需幂等,才能安全从检查点恢复。

7. 自动修复​

权威记录明确且操作可重放时,可以自动修复。例如数据库版本高于索引版本,可重建该投影。

修复写入需检查目标版本,避免覆盖新的合法变化。金额、数量和范围设定上限。含义不明或存在多种解释的差异进入人工队列。

8. 人工修复​

修复工具发送业务命令,记录操作者、原因和工单号。命令复用正式业务的鉴权、状态校验和幂等能力。

高风险操作可使用预览、双人审批和金额上限。每次操作保留不可变审计,并提供结果查询。执行后重新对账。

9. 修复演练​

演练注入重复、乱序、丢事件和外部结果未知。验证告警、差异定位、重放和人工入口。

恢复耗时需在接近生产的数据量下测量。发现时间与修复时间都应有目标。

10. 常见问题​

10.1 投递保证与业务对账​

至少一次投递覆盖定义范围内的消息交付。漏生成事件、错误确认和人工改表仍会造成差异。业务对账从结果检查这些缺口。

10.2 人工修复的边界​

11 · 面试题卡片​

11.1 分布式流程补偿多次失败后,如何发现并安全修复​

出现公司:暂无已核验的公开来源(本站自测)

题型:综合题

考察重点

  • 稳定 ID、状态机和有限重试。
  • 权威数据、增量对账和确定性修复。
  • 人工审批、审计和恢复验证。

相关内容:稳定业务标识至修复演练。

参考回答

补偿失败需进入持久、可查询的待处理状态。

先按错误类型有限重试,并保持业务 ID 稳定。外部结果未知时核对原请求结果。

对账从权威数据发现差异。只有操作确定、幂等且版本条件有效时,才自动修复。含混冲突交给受控工具处理,并保留审批和审计。修复后重新核对,再验证恢复时间。

11.2 幂等键相同但金额不同,或者去重记录已过期时,应该怎样处理?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:请求意图、保留期与历史重放。

相关内容:幂等键的语义与生命周期。

参考回答

同键异参应返回冲突,避免把两次业务意图当成一次。

去重记录保留期应覆盖允许的重放窗口。记录过期后,可由业务唯一记录继续识别旧动作。缺少这项依据时,应拒绝旧请求并转受控修复。

12. 参考资料​