laravel - 使用 Supervisor 运行多个 Laravel 队列工作线程

标签 laravel laravel-5 queue supervisord laravel-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 个监听器一直运行。

最佳答案

在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/

相关文章:

php - 调用 Laravel Auth 辅助方法的最佳方式

php - 如何使用 Laravel 模型访问数据库 View ?

mysql - 如何在一个sql查询中按desc对两个值进行排序?

mysql - Laravel 查询生成器连接无法与 selectRaw 一起使用

php - 如何使用 Laravel 5.2 更新我的值

c++ - 字符串输入,如何判断是不是int?

javascript - 让 vue.js 2.0 与 Laravel 5.3 一起使用

php - 如何按多列对 Laravel 查询构建器结果进行排序?

c - C 中的 BST 链表 : Breadth First Search

redis - 如何在任何 MQ 平台上实现这个单一并发分布式队列?