You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel队列Worker优先级优化:优先指定队列后处理剩余任务

Laravel Worker 队列优先级扩展方案

要实现先处理jobA、jobB队列,当这两个队列为空时自动处理所有剩余队列的需求,推荐以下两种最优方案:

方案一:自定义Artisan命令(推荐)

创建自定义命令,动态获取系统中所有队列名称,拼接成jobA,jobB,其他队列的格式后,调用原生队列Worker命令,无需修改框架核心逻辑。

步骤:

  1. 生成自定义命令:
php artisan make:command QueueWorkPrioritized
  1. 修改生成的app/Console/Commands/QueueWorkPrioritized.php代码:
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class QueueWorkPrioritized extends Command
{
    protected $signature = 'queue:work-prioritized {--connection=redis} {--timeout=60} {--sleep=3} {--tries=3}';
    protected $description = 'Process high priority queues first, then all others';

    public function handle()
    {
        // 定义高优先级队列
        $highPriorityQueues = ['jobA', 'jobB'];
        
        // 从jobs表获取所有已存在的队列(去重)
        $allQueues = DB::table('jobs')->distinct()->pluck('queue')->toArray();
        
        // 合并队列:高优先级在前,其余队列去重后追加
        $processedQueues = array_merge($highPriorityQueues, array_diff($allQueues, $highPriorityQueues));
        $processedQueues = array_unique($processedQueues);
        
        // 拼接为逗号分隔的队列字符串
        $queueString = implode(',', $processedQueues);
        
        // 调用原生work命令并传递参数
        $this->call('queue:work', [
            '--queue' => $queueString,
            '--connection' => $this->option('connection'),
            '--timeout' => $this->option('timeout'),
            '--sleep' => $this->option('sleep'),
            '--tries' => $this->option('tries'),
        ]);
    }
}
  1. 运行自定义命令:
php artisan queue:work-prioritized

方案二:Shell脚本动态拼接队列(适合无PHP开发场景)

如果不想编写PHP命令,可通过Shell脚本实现动态队列拼接:

#!/bin/bash

# 定义高优先级队列
HIGH_PRIORITY="jobA,jobB"

# 从MySQL数据库获取所有队列(需替换为你的数据库连接信息)
ALL_QUEUES=$(mysql -u your_db_user -p'your_db_pwd' -D your_db_name -se "SELECT DISTINCT queue FROM jobs;")

# 过滤掉高优先级队列并转为逗号分隔格式
OTHER_QUEUES=$(echo "$ALL_QUEUES" | grep -v -E "^(jobA|jobB)$" | tr '\n' ',' | sed 's/,$//')

# 拼接最终队列字符串
FINAL_QUEUES="$HIGH_PRIORITY"
if [ -n "$OTHER_QUEUES" ]; then
    FINAL_QUEUES="$FINAL_QUEUES,$OTHER_QUEUES"
fi

# 启动Worker
php artisan queue:work --queue="$FINAL_QUEUES"

注意:若使用Redis队列驱动,需将队列查询逻辑改为Redis命令(如KEYS queues:*)后提取队列名称。

补充说明

两种方案均遵循Laravel原生队列优先级规则:Worker会优先耗尽jobA队列任务,再处理jobB,最后按顺序处理其余队列,确保Worker资源不闲置。

内容的提问来源于stack exchange,提问作者chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:35:12