应通过horizon实时监控、redis llen命令直查、数据库jobs表统计三种方式监控laravel高优先级队列积压:horizon查看pending数及吞吐下降/耗时上升;redis执行llen queues:high获取瞬时长度;db查询jobs表中queue='high'且reserved=0的任务数。

如果您在 Laravel 应用中部署了高优先级队列(如 high 队列用于风控、支付通知等关键任务),但发现任务响应延迟升高、用户反馈“已提交却无响应”,则可能是该队列出现积压,导致高优任务未能及时消费。以下是监控高优先级队列积压情况的多种方法:
一、通过 Horizon 实时指标监控 high 队列长度
Horizon 提供每 5 秒刷新一次的队列维度统计,可直接读取 high 队列的 Waiting、Processing 和 Failed 数值,无需额外开发即可快速定位积压趋势。
1、确认 Horizon 已启用并正确配置 high 队列:检查 config/horizon.php 中 environments.production.supervisor-* 块是否包含 'queue' => ['high'] 及对应标签。
2、访问 /horizon 路径,在顶部 “Queues” 标签页下查找 high 队列条目,重点关注 “Pending jobs” 指标是否持续高于阈值(如 > 50)。
3、点击该队列名称进入详情页,观察 “Jobs per minute” 是否显著下降,同时 “Avg. duration” 是否异常上升,二者叠加表明处理能力不足或存在阻塞任务。
4、使用 Horizon API 直接获取原始数据:向 /horizon/api/metrics 发送 GET 请求,解析返回 JSON 中 queues.high.waiting 字段值用于程序化告警。
二、执行 Redis LLEN 命令直查 high 队列底层长度
Horizon 统计存在缓存延迟,而 Redis 原生命令 LLEN 可瞬时返回 queues:high 键的实际列表长度,适用于对实时性要求严苛的生产环境监控。
1、确认 high 队列在 Redis 中的真实键名:默认为 queues:high,若配置了 HORIZON_PREFIX 环境变量(如 HORIZON_PREFIX=prod:),则键名为 prod:queues:high。
2、在服务器终端执行命令验证:运行 redis-cli -h 127.0.0.1 -p 6379 LLEN queues:high,观察返回整数值是否突增或持续不降。
3、将该命令嵌入健康检查脚本:当返回值 ≥ 80 时,触发日志记录并写入 /var/log/horizon-high-backlog.log。
4、设置 crontab 每 20 秒执行一次检测:添加 */20 * * * * redis-cli -h 127.0.0.1 -p 6379 LLEN queues:high | grep -qE '^[8-9][0-9]$|^1[0-9]{2,}$' && echo "$(date): high queue backlog" >> /var/log/horizon-high-backlog.log。
三、查询数据库 jobs 表中 high 队列待处理任务数
当使用 database 驱动且 high 队列任务存储于 jobs 表时,可通过 SQL 直接统计当前未被占用、可立即执行的 high 队列任务数量,结果精确且不受缓存影响。
1、确认 jobs 表中 queue 字段值为 high 的任务是否处于就绪状态:执行 SQL 查询 SELECT COUNT(*) FROM jobs WHERE queue = 'high' AND reserved = 0 AND available_at 。
2、在 Laravel Tinker 或 Artisan 命令中执行等效逻辑:调用 DB::table('jobs')->where('queue', 'high')->where('reserved', 0)->where('available_at', 'getTimestamp())->count()。
3、将该查询封装为自定义 Artisan 命令 php artisan queue:high:pending,输出纯数字结果便于 shell 脚本解析。
4、在监控系统(如 Zabbix)中配置该命令的执行结果采集项,设定触发器:当返回值连续 3 次 ≥ 60 即标记为异常。
四、利用 Debugbar Jobs Collector 捕获请求级 high 队列调度快照
Debugbar 在开发与预发布环境中可记录单次 HTTP 请求生命周期内所有分发至 high 队列的任务元信息,包括分发时间、队列名、延迟设置及是否成功入队,用于回溯积压诱因。
1、确保 Debugbar 已启用且 jobs collector 处于激活状态:在 config/debugbar.php 中确认 'collectors' => ['jobs' => true]。
2、在触发风控审核等关键操作的控制器方法中,手动分发一个 high 队列任务:ProcessRiskReview::dispatch($data)->onQueue('high');。
3、完成请求后打开 Debugbar 面板,切换至 “Jobs” 标签页,检查该任务是否显示为 “queued” 状态,并记录其 queued_at 时间戳。
4、对比后续多次请求中相同任务的 queued_at 与当前系统时间差,若差值持续扩大(如 > 15 秒),表明 high 队列消费端已严重滞后。
五、配置 Supervisor 日志分析 high 队列 worker 活跃度
Supervisor 管理的 high 队列 worker 进程日志中包含任务拉取、执行、失败等关键事件,通过解析日志频率与间隔,可间接判断是否存在积压——例如日志中 “Popped job” 条目长时间缺失即代表无新任务可取。
1、确认 Supervisor 配置中 high 队列 worker 的 stdout_logfile 指向独立路径,如 /var/log/supervisor/horizon-high-worker.log。
2、使用 tail 命令实时跟踪日志:运行 tail -f /var/log/supervisor/horizon-high-worker.log | grep "Popped job",观察输出频率是否低于预期(如应每 2 秒一条,实际间隔超 10 秒)。
3、编写日志分析脚本,统计过去 5 分钟内 “Popped job” 出现次数:若 ≤ 10 次,则判定为低活跃度,可能因队列为空或 worker 异常挂起。
4、将该脚本集成至 Nagios 或 Prometheus Node Exporter 的文本文件收集器中,使 “high worker pop rate” 成为可观测指标。











