Laravel 7运行时切换队列连接失效求助(Horizon环境)
问题分析
你遇到的核心问题是:Horizon仅配置了监听redis队列连接的Supervisor,即便你将任务指定到long_run连接,最终还是由redis连接的Supervisor处理任务——而该Supervisor启动时加载的是redis连接的retry_after=90配置,导致任务在90秒后超时。
解决方案
1. 给long_run连接添加专属Horizon Supervisor
打开config/horizon.php,在对应环境(local/production)的environments数组中,新增针对long_run连接的Supervisor配置:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'simple', 'processes' => 10, 'tries' => 1, ], // 新增long_run连接的Supervisor 'supervisor-2' => [ 'connection' => 'long_run', 'queue' => ['default'], 'balance' => 'simple', 'processes' => 2, // 根据业务需求调整进程数 'tries' => 1, ], ], 'local' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'simple', 'processes' => 3, 'tries' => 1, ], // 新增long_run连接的Supervisor 'supervisor-2' => [ 'connection' => 'long_run', 'queue' => ['default'], 'balance' => 'simple', 'processes' => 1, 'tries' => 1, ], ], ],
2. (可选但推荐)给long_run配置独立队列
为避免不同连接的任务混在同一队列被错误处理,建议修改config/queue.php,给long_run分配专属队列:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ], 'long_run' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'long_queue', // 设置独立队列名称 'retry_after' => 3600, ],
同时更新Horizon中supervisor-2的queue配置为['long_queue'],并调整任务分发代码:
dispatch(new doSomethingJob($path, auth()->user()))->onConnection('long_run')->onQueue('long_queue');
3. 生效配置并重启Horizon
执行以下命令刷新配置缓存,重启Horizon使新配置生效:
php artisan config:cache php artisan horizon:terminate # 等待几秒后重新启动Horizon php artisan horizon
完成以上步骤后,long_run连接的任务会被专属Supervisor处理,将使用3600秒的超时配置,不会再出现自动切换回redis连接的问题。
内容的提问来源于stack exchange,提问作者john555
相关产品推荐
相关产品推荐

