Laravel Работа: как обеспечить очень длительный тайм-аут для одной работы? - PullRequest
0 голосов
/ 08 апреля 2020

У моего веб-приложения есть куча заданий, все хорошо работает, кроме одного.

Мне нужна эта конкретная работа, чтобы выжить в течение длительного времени, целого часа, 3600 секунд, и, если со временем произойдет сбой, и выполнить не повторять.

Я пытался настроить это свойство в моей работе

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

Я получил, что после сбоя это частичное задание никогда не повторяется, и это нормально.

Но timeout и / или 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.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

public $timeout = 3600 будет работать, только если вы запускаете свою очередь с queue:work, но не будет работать, если вы используете queue:listen.

Кроме того, на уровне worker у вас есть параметр --timeout, где вы можете указать время ожидания на рабочем уровне, а не только на уровне работы, как это php artisan queue:work --timeout=3600.

Однако вы должны Обязательно подумайте о том, чтобы иметь отдельную очередь для заданий, которые отнимают много времени, поэтому задание должно быть поставлено в очередь в другой очереди, но все другие не требующие много времени задания могут выполняться в одной очереди.

https://laravel.com/docs/7.x/queues#customizing-очередь-и-подключение

Кроме того, timeout определяет, как долго должно выполняться это задание, а retryAfter указывает после сколько раз он должен попытаться запустить его снова. Конечно, tries необходимо установить на более высокое значение, чтобы можно было повторить попытку.

Надеюсь, это поможет.

0 голосов
/ 08 апреля 2020

Долгосрочное задание может иметь несколько факторов, определяющих причину сбоя:

  • Тайм-аут, указанный самим приложением
  • Тайм-аут, указанный в PHP config
  • Время ожидания, указанное работником очереди

Посмотрите на каждое из них, чтобы увидеть, где может быть ваше узкое место. Имейте в виду, настройки будут отличаться от сервера к серверу.

...