Кто или что следит за обработчиками очередей (queue workers) в проекте?

Ответ

В 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, чтобы графики строил. Главное — не пускать процесс на самотёк, а то будет тебе хиросима, а не фоновая обработка.