从结果倒推状态
我倾向于先定义任务完成后能观察到什么,再决定队列里保存什么。任务至少需要稳定的编号、当前状态、最近一次租约到期时间、尝试次数,以及能证明副作用已经发生的结果记录。状态可以很少:待领取、执行中、已完成、需处理;关键是每次转换都有持久化依据。
工作进程领取任务时写入一段短租约。租约到期不代表任务失败,只表示原工作进程可能已经离开。新的进程重新领取前,要先检查最终结果是否已经写入。这样,重启后重复执行的风险才有一个可检查的边界。
把重试做成可辨认的重复
外部调用通常不能和本地数据库写入放进同一个事务。可以给每个动作分配固定的幂等键,调用前记录意图,调用后记录回执。下次遇到相同任务时,先查回执,再决定继续还是重试。无法保证幂等的动作,应明确标为“需人工核对”,不要让程序无限次自动补发。
记录意图 → 执行动作 → 保存回执 → 更新任务状态。每一步都允许进程中断,恢复逻辑只需回答“上一步是否真的完成”。
让进度对人有意义
百分比经常给人虚假的确定感。相比“完成 78%”,我更愿意显示“已处理 39 / 50 个文件,正在校验第 40 个”。当任务停住,操作者能从最后一条稳定记录开始排查,也能判断该等、该重试,还是该停止。