Laravel 5.3队列设置timeout=5、expire=7却每3秒重试原因咨询
问题核心原因
你混淆了队列两种不同重试场景的触发逻辑,你配置的expire(即高版本的retry_after)参数并不负责任务主动执行失败后的重试间隔,所以才会出现和预期不符的3秒间隔。
各参数实际作用边界梳理
--tries=3:定义任务最多被尝试执行的次数,达到次数后直接写入failed_jobs表标记为最终失败,你的场景中刚好触发了3次执行就失败,符合该参数配置。--timeout=5:定义单个任务单次执行的最长时间,超过该时长worker进程会被强制杀死,仅在「任务执行超时、worker异常退出,任务没有被正常标记为完成/失败」的场景下才会触发后续的expire逻辑。queue.php中的expire=7:仅作为兜底重试逻辑的参数,负责处理上述worker异常退出、任务残留在队列中的场景:间隔7秒后其他worker可以将这个未标记完成的任务重新拉取执行。你当前的场景是任务执行主动抛出错误,任务状态被正常更新,完全不会触发该参数的逻辑。
3秒间隔的由来
Laravel 5.3中任务执行主动抛出异常后,默认的重试延迟就是3秒,该配置和expire无关。如果需要调整主动失败后的重试间隔,有两种实现方式:
- 在任务类中添加公共属性
public $delay = 7;,即可将该任务的重试间隔设置为7秒。 - 在任务的失败逻辑中调用
$this->release(7),手动指定下次重试的延迟时间为7秒。
验证expire参数的方法
你可以将任务的handle方法修改为sleep(10);,模拟任务执行超时的场景:此时worker会在5秒时被强制杀死,任务不会立即重试,等待7秒的expire时间到了之后才会被其他worker重新拉取执行,这时候就能观测到你预期的7秒重试间隔。
内容的提问来源于stack exchange,提问作者Brian H
相关产品推荐
相关产品推荐

