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 Полная версия