标准答案
- 区分暂时故障、永久错误和数据损坏,分别进入退避重试、死信修复或人工审批路径。
- 补偿动作要有幂等键、前置状态检查和审计记录,防止重复退款、重复发货等副作用。
- 重放前固定事件版本、代码版本和输入快照,限制范围并先在低风险环境或小批量验证。
- 补偿完成后要重新对账,确认业务最终状态,而不是只看队列状态变成成功。
题目解析
事件失败要先区分暂时故障、永久数据错误和业务冲突。直接批量重放会把同一个错误扩大到更多消息,甚至重复退款、发货或通知。
补偿动作可能不是原操作的反向动作:通知发出后只能发更正,货物发出后可能需要人工拦截。补偿也要有前置状态、幂等键、审批和审计。
重放前固定事件版本和代码版本,限制范围并先验证样本;完成后对账业务事实、目标状态和消息状态,不能只把死信标记为成功。
常见误区
- 误区:直接批量重放全部死信。改正:先分类、修复根因,小批量验证后再逐步扩大范围。
- 误区:补偿没有幂等和审批。改正:高风险补偿应有唯一键、前置状态、审批和结果记录。
- 误区:只修消息状态,不核对业务数据。改正:对账订单、库存、支付和外部副作用,确认最终状态真的收敛。