Очередь Laravel beanstalkd, повторяющая задания перед повторной попыткой - PullRequest
4 голосов
/ 01 мая 2019

Я настроил организацию очереди в Laravel 5.4 с помощью драйвера очереди "beanstalkd" ... Я развернул его в CentOS 7 (cPanel) и установил Supervisor ... но у меня есть две основные проблемы

  1. В журналах я обнаружил это исключение «local.ERROR: исключение« PDOException »с сообщением« SQLSTATE [42S02]: базовая таблица или представление не найдено: 1146 Таблица »{dbname} .failed_jobs 'не Существуют "Итак Вопрос № 1 есть .. Должен ли я настроить какие-либо таблицы базы данных для драйвера очереди" beanstalkd ", если да, то не могли бы вы указать структуру этих таблиц?

  2. Также я настроил команду queue: work в файле конфигурации Supervisor следующим образом

[program:test-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /home/****/****/artisan queue:work beanstalkd --sleep=3 --tries=3
autostart=true
autorestart=true
user=gcarpet
numprocs=8
redirect_stderr=true
stdout_logfile= /home/*****/*****/storage/logs/supervisor.log
  1. Я обнаружил, что журнал supervisor.log содержал несколько вызовов для задания даже после того, как первый вызов был «обработан» .. Вопрос № 2 Я отправил задание один раз, но задание было отправлено в очередь несколько раз, мне нужно решение этой проблемы. Я не хочу, чтобы одно и то же задание несколько раз помещалось в очередь?

    [2019-05-14 09:08:15] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:15] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:15] Failed:     App\Jobs\{JobName}
    [2019-05-14 09:08:24] Processed:  App\Jobs\{JobName}
    [2019-05-14 09:08:24] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:33] Processed:  App\Jobs\{JobName}
    [2019-05-14 09:08:33] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:41] Processed:  App\Jobs\{JobName}
    [2019-05-14 09:08:41] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:41] Failed:     App\Jobs\{JobName}
    
    1. Обратите внимание на разницу во времени между обработанными и невыполненными заданиями. Также я установил драйвер retry_after на 900 один раз и на 90 в другой раз ... И я не чувствовал, что это имеет какое-то значение.

1 Ответ

2 голосов
/ 14 мая 2019
  1. Создайте таблицу, используя миграцию как документированная .
php artisan queue:failed-table
php artisan migrate
  1. Задание не выполнено, поэтому повтор .

Это поведение задается опцией «try», которую ваш работник очереди получает в командной строке

php artisan queue:work --tries=3

... или tries свойство конкретной работы.

<?php

namespace App\Jobs;

class Reader implements ShouldQueue
{
    public $tries = 5;
}

В настоящее время вы видите, что задания повторяются 3 раза, а затем не выполняются. Проверьте выходные данные журнала и таблицу failed_jobs, чтобы увидеть, какие исключения были сгенерированы, и исправить их соответствующим образом.

Задание повторяется при каждом запуске метода handle. После нескольких повторных попыток задание будет fail и будет вызван метод failed(). Отказавшие задания будут сохранены в таблице failed_jobs для последующего использования или повторная попытка вручную .

  1. Также обратите внимание: есть тайм-аут и повтор после , которые необходимо установить независимо.

Значение --timeout всегда должно быть как минимум на несколько секунд короче вашего значения конфигурации retry_after. Это гарантирует, что работник, обрабатывающий заданное задание, всегда будет убит до повторного выполнения задания. Если ваш параметр --timeout превышает значение конфигурации retry_after, ваши задания могут быть обработаны дважды.

См., Истечение срока действия и время ожидания .

...