Время ожидания слушателя очереди Laravel - PullRequest
4 голосов
/ 30 марта 2019

На моем сервере Linux у меня есть следующий cron:

* * * * * php /var/www/core/v1/general-api/artisan schedule:run >> /dev/null 2>&1

CRON работает правильно.В моем Kernel.php определена запланированная команда следующим образом:

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('pickup:save')
            ->dailyAt('01:00');
        $schedule->command('queue:restart')->hourly();
    }

Запланированное задание в 1:00 выполняет мою пользовательскую команду php artisan pickup:save.Единственное, что делает эта команда, это отправляет задание, которое я определил:

    public function handle()
    {
        $job = (new SaveDailyPropertyPickup());
        dispatch($job);
    }

Итак, это задание отправлено, и, поскольку я использую драйвер базы данных для своих очередей, в jobs вставляется новая строкатаблица.

Здесь все до сих пор прекрасно работает.

Поскольку мне нужен обработчик очереди для обработки очереди, и так как этот прослушиватель очереди должен работать в основном вечно, я запускаю прослушиватель очереди следующим образом:

nohup php artisan queue:listen --tries=3 &

Это запишет все журналы из nohup в файл с именем nohup.out в моем /home каталоге

Что происходит так: в первый раз очередь обрабатываетсяи код, определенный в функции handle моего задания SaveDailyPropertyPickup, выполняется.

ПОСЛЕ того, как он выполняется один раз, мой слушатель очереди просто выходит из .Когда я проверяю журналы nohup.out, я вижу следующую ошибку:

In Process.php line 1335:

  The process "'/usr/bin/php7.1' 'artisan' queue:work '' --once --queue='default' 
  --delay=0 --memory=128 --sleep=3 --tries=3" exceeded the timeout of 60 seconds.

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

Есть ли какие-нибудь рекомендации для моей текущей ситуации?

Версия Laravel - 5.4

Спасибо

1 Ответ

1 голос
/ 30 марта 2019

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

nohup php artisan queue:listen --tries=3 --timeout=600

В вашей конфигурации вам нужно обновить повтор после того, как он должен быть больше, чем тайм-аут, чтобы избежать одновременного выполнения одной и той же работы. Предполагая, что вы используете beanstalkd.

    'beanstalkd' => [
        ...
        'retry_after' => 630,
        ...
    ],

В более профессиональных настройках я часто заканчиваю очередь на короткие задания и одну очередь на длительные операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...