项目记录:给批量任务加「暂停键」,我改了哪三处
背景
之前跑一批批量处理任务,中间发现某几条输入格式不对。当时没有暂停机制,只能等整批跑完再回头挑错,或者强行中断、重跑全部。两种都浪费,于是花了半天给流程补一个「暂停键」。
改动一:把「已处理」记成外部状态
原来进度只存在运行中的内存里,一中断就丢。改成每处理一条就往一张小表里写一行:编号、状态、结果摘要。暂停后重启,先读这张表,跳过已完成项。
这一步是其余两处的前提。没有外部状态,暂停就只是「停下来」,不是「停得住」。
改动二:先干跑,再执行
任务分成两个阶段:干跑阶段只校验输入、列出将要做的动作,不产生实际写入;确认无误后才进入执行阶段。两张清单对照着看,格式不对的那几条在干跑阶段就暴露了。
思路参考了 BackendWiki 里讲任务处理时反复提到的分层:校验、执行、记录各归各层,混在一起出问题就很难定位。
改动三:失败单独排队,不阻断整批
单条失败不再让整批停下,而是标成「待重试」放进单独队列;只有连续失败达到阈值才自动暂停并提示。这样既能继续跑完正常项,又不会在系统性错误面前一路错到底。
| 改动 | 解决的问题 |
|---|---|
| 外部进度表 | 中断后必须从零开始 |
| 干跑清单 | 错误输入混进执行阶段 |
| 失败队列与阈值 | 一条坏数据拖住整批 |
跑下来的体会
最值钱的不是暂停本身,而是干跑清单:它把「我要做什么」变成可以事先看一眼的东西。批量任务真正让人不安的部分,从来都是不知道它接下来会动哪些数据。
小结
三处改动都不涉及核心逻辑,只是把状态、校验、失败处理各自摆到台面上。加上之后,批量任务从「祈祷别出事」变成「出事也能停」。