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

13

我使用Laravel队列,使用数据库驱动和supervisor使队列工作进程一直运行:

[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个回答

28
在supervisor中,您可以使用参数numprocs指定进程数量,因此您可以向脚本添加一行,如下所示:

numprocs=5

现在,您可以做一些聪明的事情,例如,如果只有一些运行在队列上的进程需要太长时间,您可以创建一个不同的队列进程集来处理这些进程,另外一个用于轻型进程。 为了实现这一点,您可以创建一个supervisor配置,其中包含一个队列名称,如--queue=longprocess和另一个队列名称--queue=lightprocess,并在程序中将作业分配到相应的队列中,这样,长时间运行的进程不会延迟短时间运行的进程。
您还可以在一个supervisor配置文件中指定队列优先级,例如--queue=lightprocess,longprocess。这样,您的工作进程将首先查找lightprocess,然后再运行longprocess
回答你的第二个问题,就督导而言,所有进程都在运行,它不知道队列是繁忙还是空闲,因此它不能根据使用情况杀死进程并创建更多进程,所以不能在现有进程繁忙时动态配置创建更多进程。
请注意,如果您分配了多个numprocs,则必须将进程数添加到名称中。根据督导配置文档:
“Supervisor将启动由numprocs命名的此程序的许多实例。请注意,如果numprocs> 1,则进程名称表达式必须在其中包含%(process_num)s(或包括process_num的任何其他有效Python字符串表达式)。”
督导配置文档:http://supervisord.org/configuration.html

3
在 supervisor 配置文件中,添加以下代码:
process_name=%(program_name)s_%(process_num)02d
numprocs=8

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

您可以使用sudo supervisorctl status检查运行的进程数量。


0

Laravel文档中,您可以使用numprocs=3来生成3个进程。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接