自动化任务中断后,再运行一遍,是很常见的操作。但如果流程包含新增记录、发送通知或生成文件,第二次运行可能产生重复结果。设计流程时,应该提前回答“这一步是否已经做过”。
为任务找到稳定的标识
可以使用来源系统的记录编号,或者由业务上稳定的字段组合成键。文件名或执行时间不一定足够可靠:同一份内容可能换一个文件名,而不同任务也可能同时发生。
区分准备、处理中和完成
只保存一条“成功”日志,并不能解决所有问题。更清楚的做法,是保存任务标识和当前状态,在操作前检查是否已有完成结果,在操作后核对结果并更新状态。
读取任务 → 检查标识
├─ 已完成:核对结果后跳过
├─ 处理中:检查上次执行的实际状态
└─ 未开始:执行操作 → 校验结果 → 记录完成超时是最容易误判的地方
请求没有及时返回,可能是操作没有执行,也可能是操作已完成但响应丢失。应优先查询结果状态。若外部系统提供幂等键或唯一约束,应结合其具体规则使用,而不是仅靠本地的“执行过”标记。
单机记录也有局限
两个实例同时运行时,都可能读到“未开始”。仅用一个普通文件记录状态,无法自动解决并发竞争。此时需要数据库约束、事务或锁等适合环境的协调机制。
理解重复执行,不要求一开始就搭建复杂系统。先列出有副作用的步骤,再逐个确定如何识别、检查和恢复,流程就会更清楚。