问题出现得很突然,日志倒是留得挺全。一次同步 3000 份文档,跑到第 1800 份时接口开始限流,脚本整体退出,已写入的 1799 份没有任何记录,重跑又从第一条开始,集合里出现了重复 id。

刚开始盯着「批量写入不是幂等,重跑会重复」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。没有按文档记录同步状态。少数情况下是失败后直接抛出,没有把断点落盘。

少数情况下是限流错误没有退避重试。

建状态表并逐条写状态

psql -c 'create table sync_state(doc_id int primary key, status text, ts timestamptz)'

只处理未成功的文档

python sync.py --status pending,failed

批量写入改成 upsert 保证幂等

python upsert.py --file batch.jsonl

等前面都确认过,再用限流场景重跑验证不重复

python sync.py --status failed --retry 3

别只看报错消失,验证要多做一步。重跑只处理失败的那部分,集合内文档总数等于源端数量,没有重复 id,断点信息随时可查。

同步任务的第一版就该带状态表,靠日志回溯哪些写没写进去,量一大就没人能说清楚。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189