在分布式调用链中,链路追踪能回答“请求经过了哪里”,却不能单独回答“这笔业务是否已经执行”。实现业务去重,关键是让同一业务意图在重试、消息重投和回调重复到达时,都能被稳定识别,并在产生副作用的位置原子地拦截重复处理。
首先要区分链路标识与业务幂等标识。链路标识用于关联一次请求及其下游调用;重试可能生成新的链路,也可能沿用原链路,但都不应据此判断是不是同一笔业务。业务幂等键则应标识一次用户意图:同一操作的所有重试复用该键,用户重新发起操作时使用新键。可将租户或用户、业务操作类型与幂等键共同限定作用范围,并记录关键参数摘要。同一键对应不同参数时,应拒绝或明确返回冲突,不能误当作原请求重放。
去重必须落在业务副作用附近,而非只在网关做一次检查。服务端应原子地登记“处理中”状态,完成业务写入后保存结果;重复请求再到达时,返回已有结果或可查询的处理中状态。若幂等记录与业务数据能在同一事务中提交,更容易避免“业务已成功但去重记录缺失”等不一致;无法同事务完成时,需要恢复和对账机制。并发重复请求尤其要测试:若检查与写入分成互不保护的步骤,两条请求仍可能同时通过检查。
这套标识还要延伸到队列消费者和回调接收方。消息事件 ID 可用于识别重复投递,但消息层去重不等于业务只产生一次效果;消费者仍需将事件处理状态与业务变更协调起来。调用外部服务时,若对方支持幂等标识,应传递稳定的业务键;若不支持,就不能假定本地记录能阻止对方重复执行,应准备查询、补偿或人工核对路径。
链路追踪的作用,是把业务键或其安全映射、重试次数、幂等命中、处理状态和最终结果关联起来,帮助定位重复从哪一跳产生。设计目标不是承诺分布式环境里绝无重复,而是确保重复可识别、结果可查询、异常可恢复。
