基于Laravel Forge的Worker自动扩缩容方案咨询
Laravel Forge下Laravel Worker自动扩缩容方案
方案一:自定义监控脚本+Supervisor(通用所有队列驱动)
- 核心逻辑:通过监控队列长度、服务器负载,动态调整Supervisor管理的Worker进程数
- 具体操作:
- 写Shell脚本或Laravel命令,用
php artisan queue:size --queue=你的队列名获取实时队列长度 - 脚本内设置阈值:比如队列长度>5000时,调用
supervisorctl scale laravel-worker=8增加进程;队列长度<100时,调用supervisorctl scale laravel-worker=2减少进程(数值根据业务调整) - 在Laravel Forge的「调度任务」中添加定时任务,每分钟执行一次该脚本
- 提前在Forge的Supervisor配置中,确保Worker进程名统一(比如
laravel-worker),方便scale命令批量调整
- 写Shell脚本或Laravel命令,用
方案二:弹性Worker服务器组(适合大流量波动场景)
- 核心逻辑:将Worker与Web服务器分离,通过Forge API或监控触发服务器的创建/销毁
- 具体操作:
- 在Forge中创建独立的Worker服务器组,单独部署队列Worker
- 编写监控脚本,监控全局队列积压量、服务器CPU负载:当积压量持续高于阈值(如10000且5分钟未下降),调用Forge API创建新的Worker服务器;当负载持续低于阈值(如CPU使用率<20%且10分钟),销毁闲置服务器
- 配置Forge的SSH密钥和API权限,确保脚本能正常调用服务器管理接口
- 设置最低服务器数量(比如1台),避免低谷时完全停摆
方案三:Laravel Horizon自动缩放(仅Redis队列驱动)
- 核心逻辑:利用Laravel官方的Horizon工具,内置的自动缩放规则实现Worker动态调整
- 具体操作:
- 在项目中安装Horizon:
composer require laravel/horizon - 配置
config/horizon.php的生产环境规则,示例:
- 在项目中安装Horizon:
'environments' => [ 'production' => [ 'default' => [ 'maxProcesses' => 12, 'minProcesses' => 1, 'balanceMaxShift' => 2, 'balanceCooldown' => 60, ], ], ],
- 在Laravel Forge中添加Supervisor进程,运行
php artisan horizon,确保Horizon持续运行 - 开启Horizon的监控面板,实时查看队列状态和Worker扩缩情况
关键注意事项
- 所有方案都要设置最低Worker进程/服务器数,避免极端低谷时无Worker处理任务
- 队列驱动需采用持久化方案(如Redis、PostgreSQL),防止服务器销毁或进程停掉时丢失任务
- 测试扩缩容逻辑:模拟高峰队列积压、低谷空闲场景,验证自动调整是否符合预期
- 控制成本:Forge服务器按小时计费,销毁闲置服务器时需确认无正在处理的任务,可通过
php artisan queue:restart优雅终止进程
内容的提问来源于stack exchange,提问作者Ondraasek
相关产品推荐
相关产品推荐

