摘要:Laravel 队列本身不难,难的是生产环境里它"看起来活着,实际上死了"的三种经典死法:Supervisor 配置不当的静默死亡、retry_after 与 timeout 配错导致的重复消费、failed_jobs 堆积成库的慢性死亡。这篇基于生产事故复盘,把三种死法的原理、检测方法、自救配置一次讲清,最后给出队列消费的幂等清单。
关键词:Laravel、队列、Supervisor、失败重试、幂等
适合人群:用 Laravel 队列跑生产业务的团队
死法一:Supervisor 的"静默死亡"
事故现场:监控显示队列积压 8000+,但 Supervisor 状态显示 RUNNING,worker 进程也都在——队列"活着",就是不消费。
根因:worker 进程在处理一个卡死的任务(如 curl 一个不回包的外部接口,且没设超时),单个 worker 被无限阻塞;Supervisor 只监控"进程存在",不监控"进程健康",所以它永远显示 RUNNING。其余 worker 一个个被慢任务占满,消费能力归零。
自救配置:
[program:laravel-worker]
command=php /var/www/artisan queue:work redis --sleep=3 --tries=3 \
--timeout=60 --max-time=3600
process_num=4
autostart=true
autorestart=true
stopwaitsecs=60 ; 必须 > timeout,否则 stop 时 SIGKILL 硬杀

本文复盘Laravel队列在生产环境的三类典型故障:Supervisor进程静默存活但无消费能力、retry_after与timeout配置冲突导致重复执行、failed_jobs表堆积且无告警。重点解析超时机制、重试语义、健康监控及幂等设计,并给出可落地的配置策略、告警方案与任务分级实践。

114

被折叠的 条评论
为什么被折叠?



