laravel 11 中 horizon 不支持数值优先级,需通过显式配置 supervisor 的 processes 数量并设 'balance' => false 实现队列权重控制;例如 high 队列配 6 进程、default 配 3、archive 配 1,且应避免多队列共用同一 supervisor 导致资源混用。

在 Laravel 11 中使用 Horizon 管理多队列时,不能靠“优先级数字”控制执行顺序,而是通过为不同队列分配差异化的 worker 进程数来实现事实上的权重区分。关键在于 显式配置 supervisor 的 processes 并禁用自动均衡,否则 Horizon 可能动态重分配资源,覆盖你的意图。
明确指定各队列的进程数量
在 config/horizon.php 的 environments 块中,为每个 supervisor 定义其监听的队列列表和对应进程数。例如:
- 给高优先级任务(如支付、通知)分配更多进程:`'queue' => ['high', 'notifications']`, `'processes' => 6`
- 给默认任务分配中等资源:`'queue' => ['default']`, `'processes' => 3`
- 给低频任务(如日志归档)分配少量进程:`'queue' => ['archive']`, `'processes' => 1`
注意:一个 supervisor 可绑定多个队列名,但所有这些队列共享该 supervisor 的全部进程。若需完全隔离(比如 high 队列必须独占 6 个进程不与 notifications 混用),应定义多个独立 supervisor。
关闭 auto balance 避免覆盖手动配置
Horizon 默认可能启用自动平衡策略,它会根据队列积压量动态调整 worker 分配,这会直接抵消你设定的固定进程数。务必确保:
- 每个 supervisor 的
'balance' => false(或省略该键,默认为false) - 不要设为
'auto'或'simple',除非你主动想让 Horizon 动态调度 - 修改后运行
php artisan config:clear,再重启 Horizon
启动时验证实际生效的进程分配
运行 php artisan horizon 后,可通过以下方式确认配置已落地:
- 查看终端输出的启动日志,每行会显示类似
Supervisor: supervisor-1 (6 processes) - 访问 Horizon Web 面板(
/horizon),在 “Supervisors” 标签页核对各 supervisor 的Processes数值 - 用
redis-cli查看当前活跃 worker:执行keys "horizon:*:processes",再对每个 key 执行hgetall查看绑定队列与数量
补充:多 supervisor 实现更精细控制
如果某些队列需要完全独立的生命周期、超时或内存限制,可定义多个 supervisor:
- 例如
'supervisor-high'专跑['high'],设processes => 8、timeout => 60 -
'supervisor-default'专跑['default', 'emails'],设processes => 4、memory => 128 - 它们互不影响,各自按配置启动固定数量的 worker
这种结构清晰,便于监控和横向扩展,也避免了单 supervisor 内队列间资源争抢。











