Laravel队列监听器与任务随机失败且未进入失败任务表求助
Laravel队列任务随机失败问题排查请求
故障现象
- 事件触发型队列监听器及部分定时调度任务出现随机失败,故障爆发时会产生大量失败的队列监听器,抛出的未处理异常信息如下:
Unhandled exception within Laravel Queue job:
'Illuminate\Database\Eloquent\ModelNotFoundException'
- 异常提示存在特殊性:常规
ModelNotFoundException的提示为No query results for model [App\SomeModel],但本次异常以Unhandled exception within Laravel Queue job作为包裹提示,此前未在技术帖中见过该形式 - 异常未被正常处理:
worker.log中能看到任务失败记录,但这些任务并未写入存储于MariaDB的failed_jobs表;我们未设置deleteWhenMissingModels标识,根据Laravel文档,默认情况下模型缺失的任务应进入失败任务表,目前疑似这些任务要么未被写入该表,要么被自动清理/删除,未处理异常可能是诱因
核心疑问
- Laravel无法捕获/处理队列任务抛出异常的场景有哪些?
- 队列事件为何会随机失败?(正常情况下运行良好,故障发生时约1%的监听器失败,且无特定关联的监听器或事件)
已配置与排查信息
- 已设置
after_commit标识,按文档要求该标识应保证监听器在无未提交事务时执行 - Redis队列配置如下:
'redis' => [ 'driver' => 'redis', 'connection' => 'queue', 'queue' => 'default', 'retry_after' => 9000, 'after_commit' => true ],
- 系统存在多个队列,暂不确定是否需要单独配置;任务可正常进入Redis,但
after_commit的规则似乎未被遵守 - 仅事件驱动的监听器存在此故障,普通代码调度的任务未出现同类问题
补充背景
- 几周前曾遇到任务查询(如
INSERT INTO jobs等)停滞的问题,原因是等待事务提交,当时将队列从MariaDB切换为Redis,之后很快出现了本次描述的问题 - 近3天未出现该故障,但4天前曾发生数百次此类事件
内容的提问来源于stack exchange,提问作者MOHAMMED ABDUL HASEEB
相关产品推荐
相关产品推荐

