Laravel кастомная artisan команда не выполняется без optimize:clear

Рейтинг: 1Ответов: 1Опубликовано: 03.03.2023

Проблема звучит странно, я не знаю, как она появилась, всё на сервере работало хорошо.

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

Как я запускаю алгоритм?

  1. На сервере в cron кадую минуту вызываю php artisan schedule:run
  2. В App/Console/Kernel.php находится такой код:
// Every minute update mining data for every rig
$schedule->command('mining:run')->everyMinute();

// ВНИМАНИЕ. Без этой очистки кэша вообще очереди перестают вызываться
$schedule->command('optimize:clear')->everyMinute();

// Restart queue every day
$schedule->command('queue:restart')->cron('0 0 * * *');

// Configure running queues
$schedule->command('queue:work --tries=3')
  ->cron('* * * * *')
  ->withoutOverlapping();
  1. В App/Console/Commands находится MiningRunCommand.php, в котором вызывается MiningRunJob::dispathc()
  2. В самом job'е у меня 2 лога о старте и завершении выполнения алгоритма, а между ними сам алгоритм, который обрабатывает, напомню, несколько тысяч записей в бд. КОТОРЫЙ 2 ДНЯ НАЗАД РАБОТАЛ НОРМАЛЬНО 5+ месяцев.

Так вот, раньше в логи у меня каждую минуту выводилось start, а потом end - алгоритм начал выполняться, а потом закончил. Всё хорошо. Но 2 дня назад просто так он перестал выполняться. Я что-то потыкал, 200 раз перезапустил очереди, очистил кэш и тд и тп, вроде заработало после того, как я начал вызывать каждую минуту optimize:clear - это very bad practive, скороее всего. Но, почему-то теперь БЕЗ ОШИБОК в логах я вижу такую картину: start start start end start end start start end.

То есть некоторая часть запусков алгоритма завершается, а некоторая - нет (start есть, а end нет). И НЕТ НИКАКИХ ОШИБОК. В т.ч в failed jobs

Наведите на мысль, что могло произойти и как это пофиксить. Почему без очистки очереди не работают?

Ответы

▲ 0Принят

Долго я пытался решить эту проблему, но всё-таки получилось. Тех.поддержка хостинга сказала, что у меня очень много процессов запущенно, а сервер упирается в ограничения cloud linux.

Чтобы процессы завершали своё выполнение нужно добавить --stop-when-empty при вызове queue:work

$schedule->command('queue:work --stop-when-empty')
         ->everyMinute()
         ->withoutOverlapping();