两个系统对接时,上游可能因网络超时再次发送同一请求,而下游已经执行了业务操作。设计幂等处理时,需要识别同一业务请求,并协调业务写入与处理结果记录。
确定业务唯一标识
由来源系统、业务类型和业务编号等字段构成稳定标识。同一标识再次到达时,应核对关键请求内容;内容冲突应显式报错,不能把不同业务当成同一次请求。
约束与事务共同处理并发
仅在写入前查询一次是否存在,不能阻止两个并发请求同时通过检查。应结合唯一约束及事务,把幂等记录与可事务化的业务变更协调处理,并对唯一冲突返回一致的处理状态。参考:PostgreSQL 约束说明
区分处理中、成功和失败
重试可能发生在首次操作仍未结束时。需要定义处理中如何响应、成功结果如何复用、失败是否允许重试。对外部系统调用,还需结合对方的幂等能力、结果查询与补偿机制处理,不能把本地事务等同于全链路只执行一次。
让异常可追踪
记录业务标识、请求结果和必要的排查信息,控制日志中的敏感内容。重试达到约定上限后,进入人工处理流程,并通过对账检查最终业务结果。