8 万行导入到 63%,用户刷新页面,进度条回到 0 并一直转圈,轮询接口返回 404,换个浏览器打开又是另一个数字。日志里能对上时间点,这种反而好排。

进度写在我进程内的字典里,下一次轮询被负载均衡打到另一台实例,读不到这个批次。服务重启或实例扩容后,旧进度也一起消失。这一点先确认清楚,后面就不用反复试。

r.setex('import:%s' % batch_id, 3600,
        json.dumps({'done': n, 'total': total}))
# 前端每 2 秒带 batchId 轮询

「导入进度丢失」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。

处理上按这个顺序:进度按 batchId 写进 Redis 并设一小时过期;前端每次轮询都带同一个 batchId 不要依赖会话;导入结束后把结果落到任务表 进度键可以放心过期。

结果对不对很好判断,刷新页面后进度从 63% 接着走,换一台实例轮询数字一致,导入完成后能查到最终成功和失败条数。

作者 9823189