SLOT-H: Запуск сервера очередей



В системе реализован собственный сервер очередей для выполнения фоновых задач. Он работает через CLI-воркер, который запускается по расписанию и обрабатывает задачи в асинхронном режиме.




Что такое сервер очередей



Сервер очередей - это механизм для выполнения задач, которые не должны выполняться синхронно в рамках HTTP-запроса. Примеры таких задач: отправка писем, создание дампов базы данных, парсинг данных, автоматический перевод текстов.

Задачи помещаются в очередь и обрабатываются фоновым процессом. Это освобождает пользовательский интерфейс от ожидания и позволяет выполнять ресурсоёмкие операции без влияния на скорость работы сайта.




Структура сервера очередей



Сервер очередей состоит из двух основных компонентов:

- Демон (`demonAction`) - процесс-супервизор, который запускается по cron каждую минуту. Он проверяет, работает ли воркер, и перезапускает его при необходимости. Также демон следит за выполнением задач и очищает устаревшие логи.

- Воркер (`queueAction`) - основной процесс, который обрабатывает задачи из очереди. Он работает в бесконечном цикле: берёт новую задачу, запускает её обработку, ждёт секунду и повторяет.




Запуск демона



Демон запускается через cron. В crontab добавляется запись:

bash
*/1 * * * * php <путь к проекту>/Application/Tools/cli.php -stage=<имя ini-файла> -module=Base -controller=Cli -action=demon

Демон проверяет наличие работающего воркера каждую минуту. Если воркер не найден, демон запускает его и завершает работу.

Запуск воркера


Воркер запускается демоном автоматически. Команда запуска:

bash
php Application/Tools/cli.php -stage=<имя ini-файла> -module=Base -controller=Cli -action=queue -request=0

Воркер работает в бесконечном цикле до истечения заданного времени жизни (QUEUE_LIFETIME). После завершения цикла воркер перезапускается демоном.

Обработка задач


Воркер получает задачи из таблицы queues. Для каждой задачи определяется её тип (action) и запускается соответствующий обработчик.

Типы задач в демо-версии:



dump - создание дампа базы данных

Каждая задача выполняется в отдельном процессе, что позволяет обрабатывать несколько задач параллельно. Количество одновременных процессов регламентируется параметром во избежание чрезмерной нагрузки на сервер.

Типы задач


Задачи в очереди делятся на два типа:

Возобновляемые - задачи, которые должны выполняться периодически. Например, парсеры валют или курсов. После завершения такой задачи (успешно или с ошибкой) она автоматически добавляется в очередь снова через заданный интервал времени.

Разовые - задачи, которые выполняются один раз. Например, отправка email или push-уведомлений. После завершения такие задачи не пересоздаются.

Для возобновляемых задач достаточно запустить процесс один раз, настроив периодичность. Например, задача получения валют с периодичностью раз в сутки: после завершения она автоматически будет добавлена в очередь через 86400 секунд.

Мониторинг процессов


Демон регулярно проверяет состояние запущенных процессов. Если процесс завершился аварийно (по ошибке), он помечается воркером как абортированный (статус QUEUE_STATUS_ABORT). Это позволяет отслеживать проблемы и принимать меры.

Логирование


Сервер очередей пишет логи в папку Config/Logs/<имя проекта>. Основные файлы логов:

queue - логи работы демона и воркера

dump - логи создания дампов

Логи помогают отслеживать работу сервера и диагностировать проблемы.

Остановка сервера


Для остановки сервера необходимо:

Удалить задачу из cron

Абортировать все процессы, использующие cli.php

Команда для остановки всех процессов очереди:

bash
pkill -f "cli.php.*-action=queue"

Или более мягкий вариант - найти и завершить конкретные процессы через
bash
ps aux | grep cli.php


Особенности


Сервер очередей работает только в CLI-режиме. Запуск через веб-интерфейс невозможен.

Демон и воркер используют один и тот же конфигурационный файл проекта.

Задачи могут быть запланированы на определённое время через поле queue_time. Если время не указано, задача выполняется немедленно.

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

Аварийно завершённые процессы помечаются статусом QUEUE_STATUS_ABORT.




Что дальше?



- ➡️ Раздел 28. Задачи сервера очередей
- ➡️ Раздел 29. Хелперы
- ➡️ Раздел 30. Демо-версия vs Полная версия