Laravel Job:如何确保单个作业的超时时间很长?

问题描述 投票:0回答:2

我的网络应用程序有很多工作,都运行良好,一个很好。

我需要这项特殊工作才能长时间,一个小时,3600秒生存下来,并且如果超时就会失败,并且不要重试。

我尝试在我的工作中设置此属性

public $timeout = 3600;     
public $retryAfter = 4000;  
public $tries = 1;          

我获得了失败后,该特定任务从未被重试过,没关系。

但是超时和/或retryAfter将被忽略。几分钟后,该作业被标记为失败。

我做错了什么?另外,请问与timeout和retryAftrer有何区别?!?

有关我的上下文的更多信息

我的队列由主管按如下方式管理:

[program:projectname-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/appdemo.projectname.com/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/appdemo.projectname.com/storage/logs/laravel_worker.log

这是根据Lararavel的文档建议的配置。

laravel jobs laravel-6
2个回答
0
投票

public $timeout = 3600仅在使用queue:work运行队列时有效,但在使用queue:listen时无效。

此外,在worker级别上,您具有--timeout参数,您可以在该级别上在工作人员级别上指定超时,而不仅仅是在工作级别上指定超时,例如php artisan queue:work --timeout=3600

但是,您绝对应该考虑为耗时的作业创建一个单独的队列,以便将作业排在另一个队列中,但是所有其他非耗时的作业都可以在一个队列中运行。

https://laravel.com/docs/7.x/queues#customizing-the-queue-and-connection

此外,timeout定义该作业应运行多长时间,retryAfter指定应在多少时间后再次尝试运行该作业。当然,tries需要设置为更高的值,因此可以重试。

希望这会有所帮助。


0
投票

长期运行的工作可能与导致其早期失败的几个因素有关:

  • 由应用程序本身指定的超时时间
  • PHP配置指定的超时时间
  • 队列工作人员指定的超时时间

查看其中每一个,看看您的瓶颈可能在哪里。请记住,设置因服务器而异。

© www.soinside.com 2019 - 2024. All rights reserved.