Laravel队列优先级需通过多队列+多进程实现:启动多个queue:work进程分别监听high/low队列,用--sleep和--max-jobs控制执行节奏;不支持任务级priority参数,仅支持队列名维度分流。

如果您在 Laravel 中使用 php artisan queue:work 命令启动队列监听器,但发现高优先级任务未被及时处理,则很可能是由于未正确配置 --queue 参数的消费顺序。Laravel 依据该参数中队列名称的排列先后决定消费优先级:靠前的队列名会被持续轮询,仅当其为空时才转向下一个。以下是实现队列消费顺序控制的具体方法:
一、按顺序指定多个队列名称
该方法利用 Laravel 队列处理器对 --queue 参数中队列名的严格从左到右扫描机制,使高优队列始终获得优先轮询机会。处理器不会并行消费,而是单线程依次检查各队列头部是否有待处理任务。
1、在分发任务时,显式指定目标队列名,例如将紧急通知任务推送到 urgent 队列:
dispatch(new SendUrgentNotification($data))->onQueue('urgent');
2、将普通业务任务推送到 default 队列:
dispatch(new ProcessOrder($data))->onQueue('default');
3、启动队列工作进程时,按期望消费顺序传入队列名列表:
php artisan queue:work --queue=urgent,default,low
4、验证队列是否生效:向 urgent 队列推送一条任务后,观察日志是否立即触发 handle() 方法,而非等待 default 队列清空。
二、结合 Supervisor 多进程隔离消费
此方式通过运行多个独立的 queue:work 进程,分别绑定单一队列,避免单进程轮询带来的隐式延迟,尤其适用于高并发且优先级差异显著的场景。各进程互不干扰,可单独配置内存、超时与重试策略。
1、为 high 队列创建专用 Supervisor 配置段,设置命令为:
php artisan queue:work --queue=high --sleep=1 --max-jobs=1000
2、为 default 队列创建另一段配置,命令为:
php artisan queue:work --queue=default --sleep=3 --max-jobs=500
3、确保 Supervisor 的 numprocs 均设为 1,防止同一队列内进程竞争。
4、重载 Supervisor 配置并启动:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all
三、动态切换默认队列并配合 --queue 参数覆盖
该方法通过修改配置文件中的默认队列名,再使用 --queue 显式覆盖,形成双重保障机制。适用于需要全局降级或临时提升某类任务优先级的运维操作,无需修改代码即可生效。
1、编辑 config/queue.php 文件,将 'default' => 'low' 修改为 'default' => 'high';
2、在部署脚本或上线指令中,强制指定消费顺序:
php artisan queue:work --queue=high,default,low --tries=3
3、确认 APP_ENV 为 production 时,Laravel 不会因配置缓存未刷新而读取旧值;执行 php artisan config:clear 确保生效。
4、检查 Redis 中对应队列键是否存在积压:
redis-cli -h 127.0.0.1 -p 6379 llen queues:high











