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