我使用 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 个监听器一直运行。
最佳答案
在supervisor中,您可以使用参数numprocs
指定进程数量,因此您可以在脚本中添加一行内容:
进程数=5
现在,您可以做一些聪明的事情,例如,如果只有在队列上运行的某些进程花费太长时间,您可以创建一组不同的队列进程来处理这些进程和其他轻进程集。
为了实现这一点,您可以使用一个队列名称(例如 --queue=longprocess
)创建一个主管配置,并使用另一个队列名称(例如 --queue=lightprocess
),然后在您的程序中分派(dispatch)作业放在相应的队列中,这样长进程就不会延迟短进程。
您还可以指定 queue priorities在一个 Supervisor 配置文件中,例如 --queue=lightprocess,longprocess
。这样,您的工作线程将在运行 longprocess
之前首先查找 lightprocess
。
要回答你的第二个问题,不,就管理程序而言,所有进程都在运行,它不知道队列是忙还是空闲,因此它无法杀死进程并根据其使用情况创建它们,所以不,您不能仅在您拥有的进程繁忙时才创建更多进程的动态配置。
注意,如果您分配超过 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.
Supervisor 配置文档:http://supervisord.org/configuration.html
关于laravel - 使用 Supervisor 运行多个 Laravel 队列工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276079/