У нас есть работа MyPrettyJob
, которая ставится в очередь через redis с контроллера.Когда мы запускаем это задание из команды вот так, задание выполняется успешно.Когда мы запускаем задание с небольшим объемом данных, очередь остается в оперативном режиме, но когда мы запускаем задание с большим объемом данных, происходит сбой очереди с кодом выхода 12, что указывает на ошибку «Недостаточно памяти».
Большая работа обрабатывает около 300 000 предметов, которые в основном зависят друг от друга.С этой целью мы не можем по-настоящему разделить эту работу, не оказав серьезного влияния на производительность.В некоторых крайних случаях это может занять несколько часов вместо нескольких минут, которые в настоящее время требуются.
Для больших заданий очередь выводит следующее:
$ php artisan queue:work --queue=myqueue
Processing: App\Jobs\MyPrettyJob
Processed: App\Jobs\MyPrettyJob
$ echo $?
12
Работник очереди даже падаетнезависимо от того, если что-то стоит в очереди за этой работой.Кажется, это говорит о том, что очередь вылетает из-за очистки большого задания, но, похоже, не дает никаких указаний на то, что это такое.Работник очереди также аварийно завершает работу, независимо от того, выполняется ли какое-либо взаимодействие с базой данных, что определяет все, что связано с базой данных.
Что делает очередь, выполняющая промежуточные задания?Могу ли я отладить каким-либо образом, почему он выходит из памяти после завершения работы?Может быть, очередь записывает что-то в журнал, или делает что-то в redis между заданиями?Похоже, действительно странное время для сбоя этого процесса.