线上发生了一次退款失败的case,通过客诉反馈,这个问题出现的几率极低,跟了半天日志,发现了根因:
上游重复调用了两次,这两次调用打在了不同的机器上;
而且先打到的机器并没有原子性的执行完步骤一和步骤二,导致机器B处理时步骤一的逻辑处理是错误的,同时导致步骤二结果不符合预期;
机器A执行步骤二时,由于机器B已经执行并落库,因数据库唯一索引导致机器A执行失败;
执行顺序大致是这样的
解决
1、代码增加分布式锁 防止并发问题
2、代码逻辑优化,保证幂等性,分布式锁解决不了间隔时间较长的重复调用。