现场是这样的。批量向量化五十万条,进度存在 Python 字典里,容器滚动更新后从第 0 条开始,重复调用了五十万次 embedding 接口。

中间走过弯路,把「批处理没有游标概念」当成主因,改完现象没变。

原因不止一个,得分开看。进度只在进程内 没有落盘;容器重启没有优雅退出钩子;缺少按批提交的事务边界。

进度写入 Redis 每批更新一次

redis-cli SET job:cur 12000

注册退出信号钩子刷一次盘

python -c "import signal;signal.signal(signal.SIGTERM,lambda *a: print('flush'))"

随后按批提交 每批五百条

python embed_job.py --batch 500 --commit-per-batch

末了启动时读游标续跑

python embed_job.py --resume --cursor-key job:cur

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

中途换过一次思路,把范围缩到最小的那一层,反而快了。

别只看报错消失,验证要多做一步。滚动更新后从断点继续,重复调用条数为零,总耗时与单次全量一致。

无常驻状态的服务要假设随时会被杀,进度落盘是基本要求。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189