拉卡拉开放平台
同一笔业务被处理两次,表面看是个小概率事件,一旦发生却是实打实的资金差错。理解重复的来源,才能防得住。
| 来源 | 典型场景 | 特征 |
|---|---|---|
| 用户重复提交 | 按钮被点了两次 | 时间极接近 |
| 网络自动重发 | 超时后客户端重试 | 间隔略长 |
| 通知重复送达 | 接收端未正确确认 | 与业务无关,来自推送侧 |
| 任务重复执行 | 定时任务或消息重投 | 可能间隔较久 |
三个角度交叉起来,来源基本就能确定,后续防护也就有了针对性。
这一点非常关键:
前者是防重复机制的问题,后者是单号设计的问题,修法完全不同。
只做第一层是不够的——它能拦住用户,拦不住网络重发与消息重投。
两个相同请求同时到达时,如果采用先查询再写入的方式,两边都会查不到记录,于是都继续往下执行。
正确做法是把判定与写入合并成一个不可分割的动作,例如利用唯一约束或原子操作。
第四步不能省略,否则同样的问题还会再发生。
设计时应默认「任何请求都可能来第二次」。有了这个前提,幂等就不是补丁,而是设计的一部分。
下单环节的重复还有机会通过后续对账发现并纠正,而退款与分账的重复会直接造成资金差错,且往往要等到对账时才被发现。
因此这两处的幂等要求,应当比下单环节更严格,而不是沿用同一套标准。
| 监控项 | 作用 |
|---|---|
| 相同单号多次处理 | 直接发现重复 |
| 幂等拦截次数 | 反映重复发生的频率 |
| 拦截后仍产生副作用 | 说明幂等实现有问题 |
第二项尤其有用:拦截次数上升,通常意味着上游出现了异常,值得提前关注。
幂等记录会不断累积,需要有清理策略:保留时间应覆盖可能出现的重复窗口,过期后可安全删除。清理动作本身不应影响正在进行的判定。
重复不可能被完全消灭,但可以让它变得可见。只要能观测到,它就不至于悄悄造成损失。
第三点是从被动防守转向主动治理的关键一步。
重复处理这件事,防胜于查。把幂等当作设计前提而非补救措施,是最省力的做法。
从这个角度看,幂等保护的收益不在于技术优雅,而在于它把一类高风险差错变成了低风险的重复拦截。
下一篇:对账总是差几笔:常见原因清单
24小时免费咨询
请输入您的联系电话,座机请加区号
