delayed_job进程终止/服务器退役时执行中作业的状态及解锁方案问询
Delayed Job 异常场景下的作业状态与处理方案
1. delayed_job进程被杀死时的作业状态
- 正在执行的作业会立刻终止,被标记为失败,
last_error字段会记录终止相关的错误日志。 - 默认会进入重试队列,按照配置的重试次数循环重试,达到重试上限后停止重试。
2. 服务器退役时的作业处理
- 若退役前delayed_job进程已正常停止:未执行的作业会留在队列中,由集群内其他正常运行的delayed_job进程拾取执行。
- 若退役时进程仍在运行:正在执行的作业会和进程被杀死的情况一致,标记失败后进入重试流程;未执行的作业则等待其他进程处理。
3. 作业未完成却锁定的情况与解决办法
不会永久卡住,因为delayed_job自带锁定超时机制:
- 被拾取的作业会设置
locked_at和locked_by字段,超过默认30分钟的锁定时间后,其他进程会判定该作业失效,自动解锁并重新拾取执行。
额外优化方案:
- 根据作业实际执行时长,调整
DELAYED_JOB_LOCK_TIMEOUT配置,适配不同类型的作业,避免短作业被误解锁或长作业超时过久。 - 特殊场景下手动解锁:直接修改数据库中对应作业的
locked_at和locked_by字段为空,解除锁定后作业会被重新执行。
内容的提问来源于stack exchange,提问作者Lucas D
相关产品推荐
相关产品推荐

