Асинхронная очередь задач
INFRAX использует мощную систему асинхронной очереди задач для выполнения длительных операций в фоновом режиме. Это позволяет не блокировать интерфейс пользователя и обеспечивает надежное выполнение задач с автоматическими повторными попытками при ошибках.
Обзор системы
Система асинхронной очереди задач в INFRAX — это центральный механизм для выполнения всех фоновых операций в системе. Она обрабатывает как пользовательские задачи (например, установка агентов, сканирование сети), так и системные задачи (мониторинг, проверка доступности узлов).
Основные возможности
- Асинхронное выполнение — задачи выполняются в фоновом режиме, не блокируя интерфейс
- Приоритизация — поддержка приоритетов для управления порядком выполнения задач
- Автоматические повторы — при ошибках система автоматически повторяет выполнение задачи
- Многопоточность — параллельное выполнение нескольких задач одновременно (до 40 потоков)
- Отказоустойчивость — задачи не теряются даже при перезапуске системы
- История выполнения — полный журнал всех задач с подробными логами
- Прерывание задач — возможность отмены выполняющихся задач
Благодаря асинхронной очереди, пользователи могут запускать длительные операции (например, сканирование большой сети) и сразу продолжать работу с системой. Задача будет выполнена в фоне, а пользователь получит уведомление о завершении.
Архитектура
Система очереди задач построена на основе специального фонового сервиса, который постоянно работает на сервере и обрабатывает задачи из очереди.
Компоненты системы
1. Таблица задач
Все задачи хранятся в таблице базы данных, что обеспечивает их сохранность даже при перезапуске системы. Каждая задача содержит:
- Уникальный идентификатор
- Тип задачи
- Время добавления в очередь
- Время следующей попытки выполнения
- Количество попыток выполнения
- Приоритет
- Данные задачи (параметры выполнения)
- Флаг прерывания
2. Обработчик задач (Consumer Service)
Фоновый сервис, который:
- Непрерывно опрашивает таблицу задач
- Выбирает задачи, готовые к выполнению
- Распределяет задачи между рабочими потоками
- Обрабатывает результаты выполнения
- Управляет повторными попытками
3. Обработчики типов задач (Task Handlers)
Для каждого типа задачи существует свой обработчик, который содержит конкретную логику выполнения. Обработчики регистрируются в системе и вызываются автоматически при обработке соответствующего типа задачи.
Настройки сервиса очереди
| Параметр | Значение | Описание |
|---|---|---|
| Количество потоков | 40 | Максимальное количество параллельно выполняемых задач |
| Задержка между попытками | 30 секунд | Время ожидания перед повторной попыткой |
| Лимит попыток | 10 | Максимальное количество попыток выполнения задачи |
| Умножение времени задержки | Отключено | Задержка остается постоянной (не увеличивается) |
Жизненный цикл задачи
Каждая задача в системе проходит через несколько этапов от момента создания до завершения:
Этапы жизненного цикла
1. Создание задачи
Задача создается либо пользователем (через интерфейс), либо автоматически (системными процессами, планировщиком). При создании задачи указываются:
- Тип задачи
- Приоритет (опционально, по умолчанию 100)
- Данные для выполнения
- Время добавления
2. Постановка в очередь
Задача сохраняется в таблицу базы данных и становится доступной для обработки. Сервис очереди периодически (каждую секунду) проверяет наличие новых задач.
3. Выбор для выполнения
Сервис очереди выбирает задачи по следующим критериям:
- Время следующей попытки меньше текущего времени (или не установлено)
- Задача не заблокирована другим потоком
- Сортировка: сначала по приоритету (desc), затем по времени попытки (asc), затем по ID (asc)
4. Блокировка задачи
Выбранная задача блокируется в базе данных, чтобы предотвратить одновременную обработку несколькими потоками. Счетчик попыток увеличивается, устанавливается время следующей попытки.
5. Выполнение задачи
Вызывается соответствующий обработчик задачи. Во время выполнения создается или обновляется запись в истории заданий со статусом "Выполняется".
6. Обработка результата
После выполнения задача может перейти в одно из состояний:
- SUCCESS — задача выполнена успешно, удаляется из очереди
- FAILED — задача завершилась с ошибкой, удаляется из очереди
- RETRY — требуется повторная попытка, задача остается в очереди
7. Завершение
При успешном выполнении или исчерпании лимита попыток задача удаляется из очереди. В истории заданий фиксируется финальный статус: "Выполнено", "Ошибка" или "Прервано".
Все операции с задачами выполняются в транзакциях базы данных, что гарантирует целостность данных даже при сбоях системы.
Приоритеты задач
Система поддерживает гибкое управление приоритетами задач. Приоритет определяет порядок выполнения задач в очереди.
Уровни приоритетов
| Приоритет | Числовое значение | Описание | Использование |
|---|---|---|---|
| Высокий | ≥ 10 | Критичные задачи | Задачи пользователя, требующие немедленного выполнения |
| Средний | 5-9 | Стандартные задачи | Обычные операции пользователя |
| Низкий | < 5 | Фоновые задачи | Системные задачи, которые могут подождать |
| По умолчанию | 100 | Стандартный приоритет | Используется, если приоритет не указан явно |
Система автоматически присваивает более высокий приоритет задачам, инициированным пользователями, по сравнению с автоматическими системными задачами. Это обеспечивает быстрый отклик на действия пользователя.
Как работает приоритизация
При выборе следующей задачи для выполнения система:
- Отбирает все задачи, готовые к выполнению (время попытки наступило)
- Сортирует их по приоритету (от большего к меньшему)
- При одинаковом приоритете сортирует по времени добавления (FIFO - первым пришел, первым вышел)
- Выбирает первую задачу из отсортированного списка
Механизм повторных попыток
Одна из ключевых возможностей системы — автоматическое повторение задач при временных сбоях.
Как работают повторные попытки
Параметры повторных попыток
- Максимальное количество попыток: 10
- Задержка между попытками: 30 секунд
- Режим задержки: фиксированная (не увеличивается с каждой попыткой)
Процесс повторной попытки
- При ошибке выполнения обработчик задачи устанавливает состояние RETRY
- Счетчик попыток увеличивается на 1
- Устанавливается время следующей попытки (текущее время + 30 секунд)
- Задача остается в очереди
- Через 30 секунд задача снова становится доступной для выполнения
- Процесс повторяется до успешного выполнения или достижения лимита попыток
Если задача не смогла успешно выполниться за 10 попыток, она удаляется из очереди и помечается в истории со статусом "Ошибка". Это предотвращает бесконечное зацикливание проблемных задач.
Типичные сценарии использования повторов
| Сценарий | Причина сбоя | Результат повтора |
|---|---|---|
| Сетевой таймаут | Временная недоступность узла | Успех при следующей попытке |
| Блокировка ресурса | Ресурс занят другим процессом | Успех после освобождения ресурса |
| Временная перегрузка | Система временно перегружена | Успех после снижения нагрузки |
| Критическая ошибка | Неправильные параметры задачи | Ошибка после всех попыток |
Состояния задач
В системе используется несколько состояний для управления жизненным циклом задачи.
Внутренние состояния очереди
| Состояние | Описание | Действие |
|---|---|---|
SUCCESS |
Задача выполнена успешно | Задача удаляется из очереди, в истории статус "Выполнено" |
FAILED |
Задача завершилась с ошибкой | Задача удаляется из очереди, в истории статус "Ошибка" |
RETRY |
Требуется повторная попытка | Задача остается в очереди для повторного выполнения |
Статусы в истории заданий
В истории заданий (доступной пользователям) используются более понятные статусы:
| Статус | Индикатор | Описание |
|---|---|---|
| Выполняется | InProgress | Задача в процессе выполнения |
| Выполнено | Done | Задача успешно завершена |
| Ошибка | Failed | Задача завершилась с ошибкой |
| Прервано | Canceled | Задача была прервана пользователем |
Активные задания
Раздел "Активные задания" позволяет просматривать текущее состояние очереди задач и отслеживать задачи, находящиеся в процессе выполнения или ожидающие своей очереди.
Чтобы открыть раздел активных заданий, перейдите в меню администрирования и выберите соответствующий пункт в разделе автоматизации.
Информация об активных задачах
В таблице активных заданий отображаются следующие данные:
| Колонка | Описание |
|---|---|
| Тип | Маркер, указывающий тип задачи: "Системная" или "Пользовательская" |
| ID | Уникальный идентификатор задачи |
| Название задания | Описательное название задачи (или "Без названия" если не указано) |
| Создана | Дата и время добавления задачи в очередь |
| Попыток выполнения | Количество попыток выполнения задачи (бейдж с числом) |
| Приоритет | Приоритет задачи: Высокий, Средний или Низкий |
| Тип | Внутреннее название типа задачи |
Фильтрация и поиск
Таблица активных заданий поддерживает следующие возможности фильтрации:
- Поиск по ID — поиск задачи по её идентификатору
- Поиск по названию — текстовый поиск по названию задания
- Фильтр по дате создания — выбор задач, созданных в определенный период
- Фильтр по типу задачи — отбор задач определенного типа
- Сортировка — по любой колонке в порядке возрастания или убывания
Наличие большого количества задач в разделе "Активные задания" может указывать на проблемы в работе системы: перегрузку, сбои в выполнении задач или недостаточную производительность. Регулярно проверяйте этот раздел, чтобы убедиться, что очередь обрабатывается нормально.
Прерывание задач
Система поддерживает прерывание выполняющихся задач. Когда задача прерывается:
- Устанавливается флаг прерывания
- При следующей проверке обработчик обнаруживает флаг и останавливает выполнение
- Задача помечается как "Прервано" в истории заданий
- Задача удаляется из очереди
Прерывание задачи не происходит мгновенно — система проверяет флаг прерывания в определенных точках выполнения. Некоторые задачи могут выполниться до завершения, прежде чем обнаружат флаг прерывания.
История заданий
Раздел "История заданий" содержит полный журнал всех задач, которые были выполнены или завершились с ошибкой. Это мощный инструмент для аудита, диагностики проблем и отслеживания операций в системе.
Типы заданий
В истории заданий можно фильтровать задачи по типу с помощью переключателя режимов:
- Пользовательские — задачи, инициированные пользователями (установка агентов, сканирование сети, выполнение скриптов)
- Системные — автоматические задачи системы (мониторинг, проверка агентов, сбор метрик)
- Все — показывает задачи обоих типов
Информация в истории
| Колонка | Описание |
|---|---|
| Статус | Текущий статус задачи: Выполняется, Выполнено, Ошибка, Прервано |
| Создан | Дата и время создания задачи |
| Название | Название задачи или автоматически сгенерированное название на основе типа |
| Инициатор | Пользователь, создавший задачу, или "Планировщик" для системных задач |
Фильтрация истории
Доступные фильтры:
- Статус — Любой, Выполнено, Выполняется, Ошибка, Прервано
- Дата создания — выбор периода создания задачи
- Название — текстовый поиск по названию задачи
- Инициатор — поиск по имени пользователя
Просмотр деталей задачи
При клике на задачу в истории открывается модальное окно с подробной информацией:
Информация в карточке задачи
- Основная информация — название, статус, тип задачи
- Временные метки — время создания, время выполнения
- Инициатор — кто запустил задачу
- Лог выполнения — пошаговая история выполнения с временными метками
- Параметры задачи — данные, с которыми выполнялась задача
- Сообщения об ошибках — если задача завершилась с ошибкой
История заданий обновляется автоматически каждые 3 секунды, поэтому вы можете наблюдать за выполнением задач в реальном времени. Используйте фильтры по статусу "Выполняется", чтобы отслеживать текущие операции.
Использование истории для диагностики
История заданий — ценный инструмент для поиска причин проблем:
- Отфильтруйте задачи со статусом "Ошибка" — найдите все неудачные попытки
- Откройте карточку задачи — изучите лог выполнения и сообщения об ошибках
- Проверьте параметры — убедитесь, что задача была запущена с правильными данными
- Проанализируйте время — возможно, проблема связана с определенным периодом времени
Мониторинг очереди
Правильный мониторинг очереди задач критически важен для здоровья системы.
Признаки нормальной работы
- В разделе "Активные задания" количество задач не превышает несколько десятков
- Задачи выполняются в разумные сроки (минуты, не часы)
- Счетчик попыток выполнения большинства задач равен 1 или 2
- В истории заданий преобладают задачи со статусом "Выполнено"
Признаки проблем
- Сотни задач в активной очереди — возможна перегрузка системы или зависание обработчика
- Высокий счетчик попыток (близко к 10) — задачи постоянно завершаются с ошибкой
- Старые задачи в очереди (несколько часов или дней) — задачи не обрабатываются
- Много задач со статусом "Ошибка" — системные проблемы
Действия при проблемах
- Проверьте работу сервиса очереди — убедитесь, что процесс обработки задач запущен
- Изучите логи системы — найдите причины ошибок в задачах
- Проверьте ресурсы сервера — убедитесь, что достаточно CPU и памяти
- Проверьте подключение к базе данных — задачи могут не обрабатываться при проблемах с БД
- При необходимости перезапустите сервис — иногда это помогает устранить временные проблемы
Метрики для отслеживания
| Метрика | Норма | Проблема |
|---|---|---|
| Количество активных задач | < 50 | > 200 |
| Средний счетчик попыток | 1-2 | > 5 |
| Процент успешных задач | > 95% | < 80% |
| Время выполнения задачи | Секунды-минуты | Часы |
Рекомендации
Для администраторов
Мониторинг и обслуживание
- Регулярно проверяйте раздел "Активные задания" — не реже раза в день
- Настройте оповещения при превышении количества активных задач
- Периодически просматривайте историю заданий со статусом "Ошибка"
- Убедитесь, что сервис обработки задач настроен на автозапуск при перезагрузке сервера
- Следите за размером таблицы истории заданий — она может расти быстро
Производительность
- При высокой нагрузке рассмотрите увеличение количества потоков обработки (по умолчанию 40)
- Убедитесь, что база данных оптимизирована (индексы, производительность запросов)
- Мониторьте использование CPU и памяти на сервере
- Не запускайте одновременно большое количество тяжелых задач (например, сканирование множества сетей)
Для пользователей
Работа с задачами
- Не запускайте дублирующие задачи — проверьте "Активные задания" перед созданием новой
- Используйте приоритеты для важных операций, требующих быстрого выполнения
- Если задача долго выполняется, проверьте её статус в "Истории заданий"
- При ошибках изучите детали в карточке задачи — часто там указана причина проблемы
- Не прерывайте задачи без необходимости — дайте им завершиться естественным образом
Асинхронная очередь задач — это мощный инструмент, который делает INFRAX масштабируемым и отказоустойчивым. Правильное использование и мониторинг очереди обеспечивают стабильную работу всей системы.