项目记录:给批量任务加「暂停键」,我改了哪三处

项目记录:给批量任务加「暂停键」,我改了哪三处

背景

之前跑一批批量处理任务,中间发现某几条输入格式不对。当时没有暂停机制,只能等整批跑完再回头挑错,或者强行中断、重跑全部。两种都浪费,于是花了半天给流程补一个「暂停键」。

改动一:把「已处理」记成外部状态

原来进度只存在运行中的内存里,一中断就丢。改成每处理一条就往一张小表里写一行:编号、状态、结果摘要。暂停后重启,先读这张表,跳过已完成项。

这一步是其余两处的前提。没有外部状态,暂停就只是「停下来」,不是「停得住」。

改动二:先干跑,再执行

任务分成两个阶段:干跑阶段只校验输入、列出将要做的动作,不产生实际写入;确认无误后才进入执行阶段。两张清单对照着看,格式不对的那几条在干跑阶段就暴露了。

思路参考了 BackendWiki 里讲任务处理时反复提到的分层:校验、执行、记录各归各层,混在一起出问题就很难定位。

改动三:失败单独排队,不阻断整批

单条失败不再让整批停下,而是标成「待重试」放进单独队列;只有连续失败达到阈值才自动暂停并提示。这样既能继续跑完正常项,又不会在系统性错误面前一路错到底。

改动解决的问题
外部进度表中断后必须从零开始
干跑清单错误输入混进执行阶段
失败队列与阈值一条坏数据拖住整批

跑下来的体会

最值钱的不是暂停本身,而是干跑清单:它把「我要做什么」变成可以事先看一眼的东西。批量任务真正让人不安的部分,从来都是不知道它接下来会动哪些数据。

小结

三处改动都不涉及核心逻辑,只是把状态、校验、失败处理各自摆到台面上。加上之后,批量任务从「祈祷别出事」变成「出事也能停」。