使用 Supervisor 运行多个 Laravel 队列工作者

Posted

技术标签:

【中文标题】使用 Supervisor 运行多个 Laravel 队列工作者【英文标题】:Running multiple Laravel queue workers using Supervisor 【发布时间】:2017-01-09 14:33:31 【问题描述】:

我使用 Laravel 队列,使用数据库驱动程序和主管来保持队列工作器始终运行:

[program:laravel_queue]
command=php artisan queue:listen --timeout=1800 --tries=5
directory=/var/app/current
stdout_logfile=/var/app/support/logs/laravel-queue.log
logfile_maxbytes=0
logfile_backups=0
redirect_stderr=true
autostart=true
autorestart=true
startretries=86400
EOB

某些队列任务可能需要大约 10 分钟才能完成。

我有两个问题:

1) 我如何编辑上述脚本以在同一个队列上运行多个(例如 3 个)队列工作人员。

2) 有没有一种方法可以根据等待处理的作业数量来扩展正在运行的队列工作人员的数量?

问题 2 的原因是我们有一批繁忙的时间,然后是很多安静的时间,所以我真的不想浪费资源让 3 个侦听器一直在运行。

【问题讨论】:

【参考方案1】:

在 supervisor 中,您可以使用参数 numprocs 指定进程数量,因此您可以在脚本中添加一行内容:

numprocs=5

现在,您可以做一些聪明的事情,例如,如果只有一些在队列上运行的进程花费的时间太长,您可以创建一组不同的队列进程来处理这些进程以及其他轻量进程的集合。 为了实现这一点,您可以创建一个主管配置,其中一个队列名称为--queue=longprocess,另一个为--queue=lightprocess,在您的程序中,您将作业分派到相应的队列中,这样,长进程不会延迟短进程。

您还可以在一个主管配置文件中指定queue priorities,例如--queue=lightprocess,longprocess。这样,您的工作人员将首先查找lightprocess,然后再运行longprocess

回答你的第二个问题,不,就主管而言,所有进程都在运行,它不知道队列是忙还是闲,因此它不能杀死进程并根据它们的使用创建它们,所以没有,您无法动态配置仅在您拥有的进程繁忙时创建更多进程。

注意,如果分配超过 1 个 numprocs,则必须将进程数添加到名称中。根据主管配置文档:

Supervisor 将启动与 numprocs 命名的程序一样多的实例。请注意,如果 numprocs > 1,则 process_name 表达式必须包含 %(process_num)s(或任何其他包含 process_num 的有效 Python 字符串表达式)。

主管配置文档:http://supervisord.org/configuration.html

【讨论】:

【参考方案2】:

从Laravel docs,您可以使用numprocs=3 生成3 个进程。

并且还要指定一个队列:command=php artisan queue:listen --queue=myqueue --tries=5

【讨论】:

【参考方案3】:

在主管配置文件中。添加以下代码

process_name=%(program_name)s_%(process_num)02d
numprocs=8

这将创建程序的 8 个不同进程。您只需根据需要更改numprocs=8 的值即可。

您可以使用sudo supervisorctl status查看正在运行的进程数

【讨论】:

以上是关于使用 Supervisor 运行多个 Laravel 队列工作者的主要内容,如果未能解决你的问题,请参考以下文章

Docker使用 Supervisor 来管理进程

docker中Supervisor的使用

使用supervisor管理进程

Docker 使用Supervisor来进程管理

supervisor管理集群(多个tomcat)#yyds干货盘点#

docker之使用supervisor管理多个进程