Laravel 5.7 - 队列作业太慢

Posted

技术标签:

【中文标题】Laravel 5.7 - 队列作业太慢【英文标题】:Laravel 5.7 - Queues Jobs are too slow 【发布时间】:2019-05-29 05:21:29 【问题描述】:

我使用 Laravel 5.7 和 3 个队列作业,作业之间的时间太长/太慢。

我在第一份工作中 foreach RSS 提要项目,我在第二份工作中发送这个项目,等等......我没有详细输入,但有一些可笑的小计算,一定不要花时间。

问题是每次派遣工作都需要大量时间。 Horizo​​n 和 Telescope 不允许我调试。

我使用的机器有 32 GB 的 RAM,并且有几个进程(每个进程 15 个)可以转动尾巴。

[program:mywebsite_feeder]
command=/RunCloud/Packages/php72rc/bin/php artisan queue:work redis --queue=feeder --tries=3 --sleep=0
directory=/home/runcloud/webapps/mywebsite
redirect_stderr=true
autostart=true
autorestart=true
user=runcloud
numprocs=15
process_name=%(program_name)s_%(process_num)s

我在 laravel.log 中有这个错误:

production.ERROR:App\Jobs\FeederJob 已尝试太多次 或运行时间过长。该作业之前可能已超时。

【问题讨论】:

您是否使用“同步”队列驱动程序?对于调试失败的作业,最好尝试/捕获将异常详细信息记录到日志中。 我不想使用同步,但使用 Redis。 如果分派需要很长时间并且作业应该需要很长时间,这可能表明作业是同步运行的,而不是分派到队列中。检查代码中某处的 dd(env('QUEUE_DRIVER'))。 它给了我:redis,而不是同步。 你打电话的是 ::dispatch 还是 ::dispatchNow ?如果没有代码的 sn-p,就很难找出问题所在。我将 redis 用于我的队列,并且调度到队列是即时的。 【参考方案1】:

默认情况下,当没有可用的作业时,laravel 队列会休眠 3 秒。 你应该使用--sleep=0 选项

【讨论】:

【参考方案2】:

我遇到了同样的问题并进行了很多搜索,但没有任何帮助,即使在 horizon Github 中有一些关于此错误的问题,但没有有用的解决方案。问题是关于执行繁重任务的 Horizo​​n 和 Redis 错误。

最后,我从 Redis 和 Horizo​​n 切换到 SQL 数据库(无论你在项目中为我使用什么 mssql)作为队列连接,它解决了问题

注意:在您的工匠命令中使用 --timeout=0

【讨论】:

为什么 --timeout=0 ? 根据 laravel 文档“--timeout 选项指定 Laravel 队列主进程在杀死正在处理作业的子队列工作者之前将等待多长时间”laravel.com/docs/5.8/queues#job-expirations-and-timeouts 这个标志防止工作者杀死长期工作

以上是关于Laravel 5.7 - 队列作业太慢的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 队列 - 作业之间暂停

Laravel 队列作业不加载文件

Express 中的 Laravel 队列作业相当于啥?

生成为 Laravel 作业队列创建表的迁移?

Laravel:获取有关队列作业的详细信息

在使用数据库作为队列连接的 laravel 作业中。但是 queue:work 命令不触发队列?