Beanstalkd + supervisor + laravel : 队列处理一小时超过10000个作业
Beanstalkd + supervisor + laravel : Queue processing with more than 10000 jobs an hour
我在 Larave 5.2 中有一个项目,我正在使用:
- 豆茎
- 主管
- Laravel 5.2
- 4GB 内存的数字海洋主机
该项目主要基于webhooks。其他网站调用我们的 webhook,我将这些 webhook 添加到队列中。大约每小时有 10000 个作业被添加到队列中。
我在主管配置中设置了 50 num_process。
你能告诉我如何才能真正快速地处理队列中的作业吗?这样我就不必等待数小时来处理我的工作。
这是队列中当前状态的屏幕截图
非常感谢任何帮助。
谢谢
主管配置:
[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
每次加载框架时,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
参数,因为您当前的工作是 运行ning 作为 root 用户 - 这对于 运行 如此高的队列来说可能是不必要的特权,我认为这是一种安全风险。我建议将其设置为拥有 /var/www/html/yopify/
中文件的用户
检查您是否没有对外部 URL 的远程调用。
还在各个地方添加提示,看哪个操作耗时长。
尝试将所有队列分成多个较小的事件,不要成为一个长任务,形成事件链。
几个月前我们确实遇到过类似的问题,这就是我们所做的,
* 摆脱日志记录: 它减少了写日志的时间并加快了队列中作业的执行。
* 避免外部调用: 外部调用确实需要时间来获取数据,这也取决于所获取数据的大小。而是尝试将它们存储在内部。
* 使用子队列: 使用子队列执行子任务。
我的建议是尝试切换到 redis,因为它很容易跟踪作业状态,同时您可以在 redis 服务器(redis cli)上编写一些快速查询。
我在 Larave 5.2 中有一个项目,我正在使用:
- 豆茎
- 主管
- Laravel 5.2
- 4GB 内存的数字海洋主机
该项目主要基于webhooks。其他网站调用我们的 webhook,我将这些 webhook 添加到队列中。大约每小时有 10000 个作业被添加到队列中。
我在主管配置中设置了 50 num_process。
你能告诉我如何才能真正快速地处理队列中的作业吗?这样我就不必等待数小时来处理我的工作。
这是队列中当前状态的屏幕截图
非常感谢任何帮助。
谢谢
主管配置:
[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
每次加载框架时,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
参数,因为您当前的工作是 运行ning 作为 root 用户 - 这对于 运行 如此高的队列来说可能是不必要的特权,我认为这是一种安全风险。我建议将其设置为拥有 /var/www/html/yopify/
检查您是否没有对外部 URL 的远程调用。
还在各个地方添加提示,看哪个操作耗时长。
尝试将所有队列分成多个较小的事件,不要成为一个长任务,形成事件链。
几个月前我们确实遇到过类似的问题,这就是我们所做的,
* 摆脱日志记录: 它减少了写日志的时间并加快了队列中作业的执行。 * 避免外部调用: 外部调用确实需要时间来获取数据,这也取决于所获取数据的大小。而是尝试将它们存储在内部。 * 使用子队列: 使用子队列执行子任务。
我的建议是尝试切换到 redis,因为它很容易跟踪作业状态,同时您可以在 redis 服务器(redis cli)上编写一些快速查询。