Ответ
В production-окружении за обработчиками очередей (воркерами) следят менеджеры процессов, которые гарантируют их постоянную работу и перезапуск при сбоях. В моих проектах на PHP/Laravel это обычно Supervisor.
Почему Supervisor? Он прост в настройке, надежен и интегрируется с системными логами.
Пример конфигурации Supervisor (/etc/supervisor/conf.d/laravel-worker.conf) для Laravel:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/my-project/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
directory=/var/www/my-project
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=8 ; Запускаем 8 процессов для параллельной обработки
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-worker.log
Ключевые параметры воркера и их смысл:
--sleep=3— пауза (в секундах) при отсутствии заданий, чтобы снизить нагрузку на CPU.--tries=3— количество попыток выполнения задания перед помещением в очередь неудач (failed jobs).--max-time=3600— максимальное время жизни одного ворк-процесса (в секундах). Через час процесс будет перезапущен Supervisor'ом для предотвращения утечек памяти.numprocs=8— количество параллельных процессов-воркеров. Определяется эмпирически, исходя из нагрузки и ресурсов сервера.
Альтернативы и дополнения:
- Horizon — панель управления для очередей Laravel с детальным мониторингом, метриками и балансировкой. Я использовал его в проектах с высокой нагрузкой на очереди.
- Systemd — может использоваться вместо Supervisor, особенно в современных дистрибутивах.
- Kubernetes — в облачных микросервисных архитектурах воркеры запускаются как отдельные deployment'ы с настройками liveness/readiness проб.
Мониторинг состояния воркеров осуществляется через логи Supervisor, панель Horizon или общие системы мониторинга (например, Prometheus + Grafana).
Ответ 18+ 🔞
Слушай, история про то, как заставить эти долбаные фоновые задачи в PHP работать без сбоев — это вообще отдельный вид искусства. Ну представь: отправил ты письмо, а воркер на полпути накрылся медным тазом, и пользователь так и не получил свой пароль. Пиздец, а не ситуация. Так вот, чтобы такого не было, за этими самыми воркерами следят менеджеры процессов. По сути, это такой злой надсмотрщик, который пинает воркер, если тот вдруг решит отдохнуть навечно. В мире Laravel и PHP все обычно используют Supervisor.
А почему именно он? Да потому что он, блядь, простой как три копейки, надёжный как швейцарские часы, и всё что происходит, валится в логи, которые потом можно читать и охуевать от ошибок.
Вот, смотри, как обычно выглядит его конфиг (/etc/supervisor/conf.d/laravel-worker.conf):
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/my-project/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
directory=/var/www/my-project
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=8 ; Запускаем 8 процессов, чтобы жрали задачи параллельно
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-worker.log
Теперь по полочкам, что тут за магия творится:
--sleep=3— если в очереди пусто, воркер не будет долбить систему впустую, а поспит три секунды. CPU скажет спасибо.--tries=3— если задание обосралось, ему дадут ещё три попытки, прежде чем отправить на свалку истории (в failed jobs). А то мало ли, сеть чихнула.--max-time=3600— а это, ёпта, очень важная штука! Через час работы процесс убивается и перезапускается. Зачем? Да потому что PHP, мать его, иногда память жрёт как не в себя, и без этого он может сожрать овердохуища оперативки.numprocs=8— это сколько таких страдальцев-воркеров запустить. Цифру эту с потолка не берут, а смотрят, сколько сервер вывезет и насколько очередь забита.
Но это, конечно, не единственный вариант. Бывает и покруче:
- Horizon — это такая красивая панелька для Laravel, где видно вообще всё: что выполняется, что зависло, какая очередь пустая. Для серьёзных проектов — вещь просто пиздопроебибна. Сам использовал, когда нагрузки были дикие.
- Systemd — некоторые чуваки используют его вместо Supervisor, особенно если живут в мире современных линуксов.
- Kubernetes — ну это уже для мажоров, которые всё засунули в облака и микросервисы. Там каждый воркер — это отдельная песочница, которая живёт своей жизнью.
А следить за всем этим безобразием можно по логам самого Supervisor, через ту же панель Horizon, или настроить какой-нибудь Prometheus, чтобы графики строил. Главное — не пускать процесс на самотёк, а то будет тебе хиросима, а не фоновая обработка.