Beanstalkd + supervisor + laravel:每小时处理超过10000个作业的队列处理

时间:2016-05-17 11:02:50

标签: php laravel queue supervisord beanstalkd

我在Larave 5.2中有一个项目,我正在使用:

  • 豆茎
  • Laravel 5.2
  • 4GB RAM的数字海洋主机

该项目主要基于webhooks。其他网站调用我们的webhook,我将这些webhook添加到队列中。粗略地说,每小时有10000个工作岗位被添加到队列中。

我在主管配置中设置了50个num_process。

您能否建议我如何快速处理队列中的作业?所以我不必等待数小时才能完成我的工作。

以下是队列中当前状态的屏幕截图

enter image description here

非常感谢任何帮助。

谢谢

主管配置:

[program:laravel_queue]
command=php /var/www/html/nivesh/artisan --env=production --timeout=3600 queue:listen --queue=important,urgent,high,default
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)s
numprocs=55
stderr_logfile=/var/log/laraqueue.err.log
stdout_logfile=/var/log/laraqueue.out.log
priority=999
numprocs_start=55
startsecs=0
redirect_stderr=true

3 个答案:

答案 0 :(得分:2)

每次加载框架时,Laravel都会严重影响队列的速度。当您在队列中收听时会发生这种情况。

您应该使用--daemon flag运行队列,以避免为每个队列条目重新加载框架:

[program:laravel_queue]
command=php /var/www/html/yopify/artisan --env=production --timeout=3600 queue:work --queue=important,urgent,high,default --daemon
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)s
numprocs=55
stderr_logfile=/var/log/laraqueue.err.log
stdout_logfile=/var/log/laraqueue.out.log
priority=999
numprocs_start=55
startsecs=0
redirect_stderr=true

您也可以将Supervisor作业配置文件归结为您,因为您使用的某些参数已由默认值设置:

[program:laravel_queue]
command=php /var/www/html/yopify/artisan --env=production --timeout=3600 queue:work --queue=important,urgent,high,default --daemon
process_name=%(program_name)s_%(process_num)s
numprocs=55
stderr_logfile=/var/log/laraqueue.err.log
stdout_logfile=/var/log/laraqueue.out.log
numprocs_start=55
startsecs=0
redirect_stderr=true

我建议您使用user参数,因为您当前的作业是以root用户身份运行的 - 这可能不需要以如此高的权限运行您的队列,我认为这是一个安全风险。我建议将其设置为拥有/var/www/html/yopify/

中文件的用户

答案 1 :(得分:1)

检查您是否没有远程调用外部URL。

还要在各个地方添加提示,以查看哪个操作需要很长时间。

尝试将所有队列分成多个较小的事件,不要做1个长任务,制作一系列事件。

答案 2 :(得分:1)

几个月前我们确实遇到过类似的问题,这就是我们所做的,

*摆脱日志记录:它减少了写入日志所花费的时间,并加快了队列中作业的执行速度。 *避免外部呼叫:外部呼叫确实需要时间来获取数据,这也取决于所获取数据的大小。而是尝试在内部存储它们。 *使用子队列:使用子队列执行子任务。

我的建议尝试切换到redis,因为它可以轻松跟踪作业状态,同时您可以在redis服务器上写一些快速查询(redis cli)。