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

时间:2016-09-01 15:56:34

标签: laravel laravel-5 queue supervisord artisan

我使用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名听众在运行。

3 个答案:

答案 0 :(得分:10)

在主管中,您可以使用参数numprocs指定进程数量,因此您可以在脚本中添加一行说明:

numprocs=5

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

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

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

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

  

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在超级用户配置文件中。添加以下代码

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

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

您可以检查sudo supervisorctl status正在运行多少个进程