调用扣款接口超时,程序自动重试,最终账户被扣两次。乍看像缓存或者权限的锅,追下去往往不是。
POST /pay Idempotency-Key: 8f14e45fceea167a # 超时后先查询结果再决定是否重试
追下去是这么回事:写操作没有携带幂等标识,超时后无法判断对方是否已执行。
碰到「接口重试幂等」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,写接口携带唯一请求号;对方按请求号去重;重试只用于可安全重复的读操作。
验收就看一点,超时重试不再产生重复扣款,结果可查询。