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

Running multiple Laravel queue workers using Supervisor

我使用 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) 是否有一种方法可以根据等待处理的作业数量来调整队列工作人员的数量 运行ning?

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

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

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

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

numprocs=5

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

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

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

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

Supervisor will start as many instances of this program as named by numprocs. Note that if numprocs > 1, the process_name expression must include %(process_num)s (or any other valid Python string expression that includes process_num) within it.

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

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

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

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

你可以查看有多少进程运行sudo supervisorctl status