Horizon多服务器配置:如何让指定服务器仅处理专属队列
Laravel Horizon 多服务器队列配置方案
你的思路方向是对的,不过更高效易维护的做法是通过环境变量区分配置,而非直接替换整个horizon.php文件,具体配置步骤如下:
主服务器配置(不处理Webhooks队列)
- 在主服务器的
.env文件中添加:HORIZON_WEBHOOK_WORKERS=0 - 修改
config/horizon.php的environments配置块,对应运行环境(如production)的队列规则:
主服务器启动Horizon后,Webhooks队列的进程数为0,完全不会处理该队列任务。'production' => [ 'main-supervisor' => [ 'connection' => 'redis', 'queue' => ['default', 'notifications'], // 主服务器处理的队列列表,排除webhooks 'balance' => 'auto', 'processes' => 10, 'tries' => 3, ], 'webhooks-supervisor' => [ 'connection' => 'redis', 'queue' => ['webhooks'], 'balance' => 'auto', 'processes' => env('HORIZON_WEBHOOK_WORKERS', 0), // 读取环境变量值 'tries' => 3, ], ],
第二台服务器配置(仅处理Webhooks队列)
- 在第二台服务器的
.env文件中添加:HORIZON_WEBHOOK_WORKERS=20 HORIZON_MAIN_WORKERS=0 - 对应修改
config/horizon.php的environments配置:
启动Horizon后,第二台服务器只会运行Webhooks队列的进程,其他队列无进程运行,完全专注处理Webhooks任务。'production' => [ 'main-supervisor' => [ 'connection' => 'redis', 'queue' => ['default', 'notifications'], 'balance' => 'auto', 'processes' => env('HORIZON_MAIN_WORKERS', 0), // 主队列进程数设为0 'tries' => 3, ], 'webhooks-supervisor' => [ 'connection' => 'redis', 'queue' => ['webhooks'], 'balance' => 'auto', 'processes' => env('HORIZON_WEBHOOK_WORKERS', 20), // 启动20个Webhooks进程 'tries' => 3, ], ],
备选方案:使用独立配置文件
如果偏好直接用不同配置文件,也可以给两台服务器分别部署不同的horizon.php:
- 主服务器的配置中,Webhooks队列的
processes设为0,其他队列正常配置进程数 - 第二台服务器的配置中,仅保留Webhooks队列的配置,且
processes设为20,其他队列配置删除或设为0进程
这种方式可行,但维护两份配置文件的成本更高,环境变量的方式更推荐。
内容的提问来源于stack exchange,提问作者TKoL
相关产品推荐
相关产品推荐

