导入接口 30 秒超时,客户端自动重试三次,客户表从 2 万条变成 6 万条,每次重试都从第一行重新插入。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,第一次请求其实已经提交,只是响应在返回路上超时,客户端以为失败又发了一次。接口没有批次号也没有幂等判断,重试等同于再导入一遍。
「导入重试重复」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。
INSERT INTO import_batch (batch_id, status) VALUES (?, 'running') ON DUPLICATE KEY UPDATE status = status;
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,每次导入生成唯一 batchId 落库并加唯一索引;重试前先查这个 batchId 的状态 已成功就直接返回结果;失败重试从断点行继续 不要从头扫。
最后用这个标准收尾,模拟超时重试三次后,客户表仍是 2 万条,第二第三次请求直接返回第一次的结果,没有新增记录。
