现场是这样的。批量向量化五十万条,进度存在 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
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
中途换过一次思路,把范围缩到最小的那一层,反而快了。
别只看报错消失,验证要多做一步。滚动更新后从断点继续,重复调用条数为零,总耗时与单次全量一致。
无常驻状态的服务要假设随时会被杀,进度落盘是基本要求。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
