Laravel Job:如何保证单个job超长超时?

Laravel Job: how to ensure a very long timeout for a single job?

我的 webapp 有很多工作,全部 运行 好吧,除了一个。

我需要这个特定的作业存活很长时间,整整一个小时,3600 秒,如果超过时间就会失败,不要重试。

我试图在我的工作中设置这个属性

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

我了解到这个特殊的作业在失败后不会重试,没关系。

但是超时and/or 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

This is the suggested configurations as per Lararavel's documentation.

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 需要设置更大的值,所以它可以重试。

希望对您有所帮助。

一份长 运行 的工作可能有几个因素导致它提前失败:

  • 应用程序自己指定的超时时间
  • PHP 配置指定的超时
  • 队列工作者指定的超时

逐一查看您的瓶颈所在。请记住,设置因服务器而异。