自动化长任务治理:租约、心跳、孤儿进程与安全回收
Trace、长稳态压测和批量工件导出可能运行数小时。控制端异常退出后,设备端采集器、端口转发和临时文件仍可能继续占用资源,最终导致后续任务失败甚至磁盘爆满。
一、不要把连接存活当作任务存活
网络连接可能短暂中断,控制端进程也可能重启。任务应拥有独立 job_id 和带期限的租约。执行端只有在租约有效时继续工作;心跳用于续租,而不是作为唯一身份。
二、租约状态
text
created -> running -> renewing -> finishing -> completed
-> lease_expired -> recovering -> reclaimed
每次续租携带任务身份、执行代次和单调递增序列号,防止旧控制端恢复后覆盖新租约。
三、Fence Token
任务重派后,旧执行者可能仍在运行。为每次所有权分配递增的 fence token;写工件、更新状态和操作独占资源时验证 token。旧 token 即使重新联网,也不能继续提交结果。
四、孤儿资源清单
任务开始时登记进程、端口、临时目录、设备锁、采集会话和转发规则。回收器只处理登记在该任务名下的资源,不能按模糊进程名批量结束。
五、安全回收顺序
- 阻止任务产生新工作;
- 请求采集器正常结束并刷新缓冲;
- 校验已生成工件;
- 关闭进程、转发和设备锁;
- 删除已确认可删除的临时副本;
- 写入回收审计记录。
强制终止只作为超时后的降级动作。
六、临时文件保护
回收前解析并验证绝对路径必须位于任务工作根目录。完成上传且哈希一致的副本可以删除;未完成、损坏或仍需调查的现场进入短期隔离区,并设置容量上限和到期策略。
七、控制端恢复
控制端重启后查询执行端租约,而不是假设所有任务失败。对仍有效的任务恢复观察;对已过期任务启动回收;对状态冲突任务停止晋级并人工审核。
结语
长任务可靠性的关键不是永不掉线,而是失联后仍能明确所有权、保护有效工件并安全释放资源。租约、Fence Token 和资源登记表共同消除最危险的孤儿任务。