讯果队列优化:断点续跑与回执对账同步落地

断点续跑在讯果里不是新功能,但 5.0 版把它和回执对账合到了一起:进度按条落盘,回执带上记录编号,续跑时客户端不仅跳过已完成条目,还能把新写的回执与原批次逐条对齐。这样一份跨了两天、中间断过电的批次,也能在被问到「第 3,102 条跑没跑」时给出明确答案。续跑与对账合在一起之后,用户不需要再判断该信进度条还是该信回执,两者指向同一份记录。
此前用户遇到的情况是,续跑本身没问题,问题出在对账。旧版本的回执只有序号与结果,续跑之后序号会重新编排,导致原批次与续跑批次的记录对不上。财务对账时要把两份表拼起来,靠时间去猜哪条对应哪条,这恰恰是批量工具最该消灭的手工环节,也是 5.0 版优先处理的部分。5.0 版把这份差额补上了:续跑不只要接着跑,还要让两段执行的结果能够拼成一份完整记录。
进度落盘的粒度
进度文件按条追加:每完成一条,引擎把记录编号、状态码、耗时与时间戳写成一行,不重写整个文件。为了控制文件体积,客户端每写入 500 行做一次压缩,把已完成区间合并成区间标记,原始行保留在独立的日志文件中。这样即使批次达到 30,000 条,进度文件也不会膨胀到影响启动速度。压缩只合并已完成区间,未完成的部分仍按条记录,续跑时依然能精确到某一行。
引擎开发负责人陈屿解释了为什么选追加写:「整文件重写在条目多的时候会把磁盘拖成瓶颈,而且一旦在重写过程中掉电,文件可能只剩一半。追加写最坏的情况是丢掉最后一条,而丢最后一条的代价可以接受——它会重新跑一遍,结果写在新回执里。」陈屿补充说,这个取舍在条目少的批次里看不出差别,只有在几千条以上才会体现出来。
落盘的时机在每条请求返回并写入回执之后。也就是说,只有回执确实写成功了,这条记录才被视为完成。若写入中断,该条会在续跑时重做,但不会产生两条回执,因为回执以记录编号为唯一键,重复写入只保留一条。这个顺序看起来只是细节,却决定了续跑之后的对账能不能成立。写入回执与写入进度是两步,顺序固定:先回执,后进度,任一步失败都会在下次启动时被识别。
回执对账的字段设计
每条回执包含六个字段:记录编号、动作类型、状态码、耗时、时间戳与失败原因分类。记录编号由导入时的行号派生,一经确定不再变化,续跑、重试、导出都沿用同一个编号。动作类型用于区分同一批次里串联的多个动作,避免把核验结果和导出结果混在一张表里,导致统计口径互相污染。六个字段在回执列表、导出文件与 XLSX 报表中同名同序,看惯一处就能看懂另一处。
失败原因被归入固定分类,便于按类型筛选重试。分类既包含网络超时、连接重置这类传输问题,也包含字段缺失、格式不符这类数据问题。两类问题的处理方式完全不同:前者换个时段重跑即可,后者必须先修清单,否则重跑多少次都一样。回执里把两类分开标注,复核的人不必再去猜错误码的含义。分类之外还保留原始响应,便于在分类不足以判断时回看对端到底返回了什么。

恢复与迁移的两种场景
第一种场景是本机恢复。客户端异常退出后重新打开,在任务列表里找到对应批次点击续跑,客户端读取进度文件与回执,跳过已完成区间,从第一条未完成的记录接着跑。在一次实测中,一个跑到 1,284 条的批次因断电中断,恢复后只补跑了 37 条,用时不到一分钟,已完成条目没有重复提交,回执也没有出现重复编号。这条实测记录后来被写进使用手册,作为断电场景下续跑效果的标准示例。财务专员汤晗补充:「现在对账先看编号再看金额,两边不一致的地方能直接定位到某一条。」
第二种场景是换机迁移。整个工作目录复制到新机器后重新指定路径即可恢复,进度文件与回执都在目录内,不依赖任何云端状态。若迁移时工作目录被改名,客户端会在首次启动时提示路径变更,选择新路径后继续。注意不要把工作目录放在自动同步的网盘目录,同步进程可能在任务执行期间读到中间状态。迁移前建议先把工作目录完整复制一份,确认新路径下的进度文件与回执数量一致后再清理旧目录。
对账的最后一环是导出。批次结束后导出的成功、失败、重试三张表共用记录编号,可以直接用表格软件的查找功能做关联;失败原因已归入固定分类,按分类筛选即可决定哪些重跑、哪些先修清单。这些改动已随 5.0.0 安装包发布,专业版与团队版可直接使用,体验版同样支持断点续跑,日志保留期按版本区分,体验版 15 天、专业版 200 天,跨期批次需要在结束前导出。导出的三张表与客户端内的回执同源,条数与编号都能对上,不会出现报表比回执少几条的情况。
← 返回新闻列表示例评论
以下评论为示例内容,用于展示版式,姓名均为化名。
编号贯穿到底这一点解决了大问题。以前续跑之后要拿两份表对时间戳,现在直接按编号查。
换电脑那次把整个目录拷过去就恢复了,连失败原因都还在,比预期省事。
提醒一下别把工作目录放同步盘,我试过一次,续跑读到了中间状态,重跑两条才对上。
失败原因分类够用,网络问题和字段问题分开处理,重试不会白跑一轮。