13 KiB
13 KiB
Сводка изменений: Асинхронная обработка данных Lyngsat
Обзор
Реализована полная асинхронная обработка данных Lyngsat с использованием Celery, Redis и детальным логированием.
Ключевые улучшения
1. ✅ Асинхронная обработка
- Задачи выполняются в фоновом режиме
- Веб-интерфейс не блокируется
- Можно обрабатывать несколько задач одновременно
2. ✅ Отслеживание прогресса
- Прогресс-бар в реальном времени
- Текущий статус обработки
- Процент выполнения
3. ✅ Детальное логирование
- Логи на уровне задачи
- Логи на уровне спутника
- Логи на уровне источника
- Все ошибки записываются в лог
4. ✅ Результаты и статистика
- Количество обработанных спутников
- Количество обработанных источников
- Количество созданных/обновленных записей
- Список всех ошибок
Новые файлы
Backend
- dbapp/dbapp/celery.py - конфигурация Celery
- dbapp/dbapp/init.py - инициализация Celery app
- dbapp/lyngsatapp/tasks.py - асинхронная задача заполнения данных
- dbapp/start_celery_worker.sh - скрипт запуска worker
Frontend
- dbapp/mainapp/templates/mainapp/lyngsat_task_status.html - страница отслеживания прогресса
Документация
- ASYNC_LYNGSAT_GUIDE.md - полное руководство
- QUICKSTART_ASYNC.md - быстрый старт
- ASYNC_CHANGES_SUMMARY.md - этот файл
Измененные файлы
Конфигурация
-
dbapp/requirements.txt
- Добавлено:
celery>=5.4.0 - Добавлено:
django-celery-results>=2.5.1
- Добавлено:
-
dbapp/dbapp/settings/base.py
- Добавлено:
django_celery_resultsв INSTALLED_APPS - Добавлено: полная конфигурация Celery (брокер, результаты, таймауты, логирование)
- Добавлено:
-
docker-compose.yaml
- Добавлено: сервис Redis
- Добавлено: сервис FlareSolver
- Добавлено: volume для Redis
Backend логика
-
dbapp/lyngsatapp/utils.py
- Добавлено: параметр
task_idдля логирования - Добавлено: параметр
update_progressдля обновления прогресса - Добавлено: детальное логирование на всех уровнях
- Добавлено: логирование каждые 10 источников
- Улучшено: обработка ошибок с логированием
- Добавлено: параметр
-
dbapp/mainapp/views.py
- Изменено:
FillLyngsatDataViewтеперь запускает асинхронную задачу - Добавлено:
LyngsatTaskStatusView- страница отслеживания - Добавлено:
LyngsatTaskStatusAPIView- API для проверки статуса
- Изменено:
-
dbapp/mainapp/urls.py
- Добавлено:
/lyngsat-task-status/- страница статуса - Добавлено:
/lyngsat-task-status/<task_id>/- статус конкретной задачи - Добавлено:
/api/lyngsat-task-status/<task_id>/- API endpoint
- Добавлено:
Технические детали
Архитектура
User Request → Django View → Celery Task → Redis Broker
↓
Celery Worker
↓
┌───────────┴───────────┐
↓ ↓
LyngSat Parser PostgreSQL
↓ ↓
FlareSolver Save Results
Поток данных
-
Пользователь отправляет форму
- Django view получает данные
- Создается асинхронная задача Celery
- Возвращается task_id
- Перенаправление на страницу статуса
-
Celery Worker обрабатывает задачу
- Логирует начало обработки
- Вызывает
fill_lyngsat_dataс callback - Обновляет прогресс через
update_state - Логирует каждый шаг
- Сохраняет результат в кеш
-
Страница статуса отслеживает прогресс
- JavaScript опрашивает API каждые 2 секунды
- Обновляет прогресс-бар
- Показывает текущий статус
- Отображает результаты при завершении
Логирование
Уровни логирования
- INFO: Основные события (начало, завершение, прогресс)
- DEBUG: Детальная информация (каждая запись)
- WARNING: Некритичные ошибки (спутник не найден)
- ERROR: Критичные ошибки (с traceback)
Формат логов
[Timestamp: Level/Process][Task Name(Task ID)] [Task ID] Message
Пример:
[2024-01-15 10:30:45: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Начало обработки данных Lyngsat
[2024-01-15 10:30:45: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Спутники: Astra 4A, Hotbird 13G
[2024-01-15 10:30:46: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Получено данных по 2 спутникам
[2024-01-15 10:31:00: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Обработка спутника 1/2: Astra 4A
[2024-01-15 10:31:00: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Найдено 150 источников для Astra 4A
[2024-01-15 10:31:05: DEBUG/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Создана запись для Astra 4A 11766.0 МГц
[2024-01-15 10:31:10: INFO/MainProcess][lyngsatapp.fill_lyngsat_data_async(abc123)] [Task abc123] Обработано 10/150 источников для Astra 4A
API Endpoints
GET /api/lyngsat-task-status/<task_id>/
Ответ при выполнении:
{
"task_id": "abc123",
"state": "PROGRESS",
"status": "Обработка Astra 4A...",
"current": 1,
"total": 2,
"percent": 50
}
Ответ при успехе:
{
"task_id": "abc123",
"state": "SUCCESS",
"status": "Задача завершена успешно",
"result": {
"total_satellites": 2,
"total_sources": 300,
"created": 250,
"updated": 50,
"errors": []
}
}
Ответ при ошибке:
{
"task_id": "abc123",
"state": "FAILURE",
"status": "Ошибка при выполнении задачи",
"error": "Connection timeout"
}
Настройки Celery
Основные параметры
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60 # 30 минут
Переменные окружения
Можно переопределить через .env:
CELERY_BROKER_URL=redis://redis:6379/0
Зависимости
Обязательные сервисы
- Redis - брокер сообщений Celery
- FlareSolver - обход Cloudflare
- PostgreSQL - хранение данных и результатов
Python пакеты
celery>=5.4.0- асинхронная обработкаdjango-celery-results>=2.5.1- хранение результатовredis>=6.4.0- клиент Redis
Команды для работы
Запуск сервисов
# Redis и FlareSolver
docker-compose up -d redis flaresolverr
# Celery Worker
celery -A dbapp worker --loglevel=info
# Celery Worker в фоне
celery -A dbapp worker --loglevel=info --logfile=logs/celery_worker.log --detach
Мониторинг
# Просмотр логов
tail -f dbapp/logs/celery_worker.log
# Flower (веб-интерфейс)
pip install flower
celery -A dbapp flower
# Откройте http://localhost:5555
Отладка
# Проверка Redis
redis-cli ping
# Проверка FlareSolver
curl http://localhost:8191/v1
# Django shell
python manage.py shell
>>> from celery.result import AsyncResult
>>> task = AsyncResult('task_id')
>>> print(task.state, task.info)
Производственное развертывание
Systemd сервис
sudo systemctl enable celery-worker
sudo systemctl start celery-worker
sudo systemctl status celery-worker
Supervisor
sudo supervisorctl start celery-worker
sudo supervisorctl status celery-worker
Docker
Можно добавить Celery worker в docker-compose.yaml:
celery-worker:
build: ./dbapp
command: celery -A dbapp worker --loglevel=info
depends_on:
- redis
- db
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
Тестирование
Проверка системы
# 1. Проверка Django
python manage.py check
# 2. Проверка миграций
python manage.py migrate --check
# 3. Проверка Celery
celery -A dbapp inspect ping
# 4. Проверка Redis
redis-cli ping
# 5. Проверка FlareSolver
curl http://localhost:8191/v1
Тестовый запуск
# Django shell
python manage.py shell
from lyngsatapp.tasks import fill_lyngsat_data_task
# Запуск задачи
task = fill_lyngsat_data_task.delay(['Astra 4A'], ['europe'])
print(f"Task ID: {task.id}")
# Проверка статуса
print(task.state)
print(task.info)
Метрики и мониторинг
Что отслеживать
- Количество активных workers
- Количество задач в очереди
- Среднее время выполнения задачи
- Количество ошибок
- Использование памяти Redis
Инструменты
- Flower - веб-интерфейс для Celery
- Redis Commander - GUI для Redis
- Prometheus + Grafana - метрики и дашборды
Безопасность
Рекомендации
- Используйте пароль для Redis в production
- Ограничьте доступ к Redis только для localhost
- Используйте SSL для Redis в production
- Ограничьте время выполнения задач
- Логируйте все действия
Пример конфигурации Redis с паролем
CELERY_BROKER_URL = 'redis://:password@localhost:6379/0'
Масштабирование
Горизонтальное масштабирование
Запустите несколько workers:
# Worker 1
celery -A dbapp worker --loglevel=info -n worker1@%h
# Worker 2
celery -A dbapp worker --loglevel=info -n worker2@%h
# Worker 3
celery -A dbapp worker --loglevel=info -n worker3@%h
Приоритеты задач
Можно настроить разные очереди для разных типов задач:
@shared_task(queue='high_priority')
def urgent_task():
pass
@shared_task(queue='low_priority')
def background_task():
pass
Следующие шаги
- ✅ Применить миграции
- ✅ Запустить Redis и FlareSolver
- ✅ Запустить Celery Worker
- ✅ Протестировать через веб-интерфейс
- ⏳ Настроить production окружение
- ⏳ Добавить периодические задачи (Celery Beat)
- ⏳ Настроить email уведомления
- ⏳ Настроить мониторинг (Flower)
Заключение
Система асинхронной обработки данных Lyngsat обеспечивает:
- ✅ Неблокирующий веб-интерфейс
- ✅ Отслеживание прогресса в реальном времени
- ✅ Детальное логирование всех операций
- ✅ Масштабируемость (несколько workers)
- ✅ Надежность (retry при ошибках)
- ✅ Мониторинг и отладка
- ✅ Production-ready решение
Для получения дополнительной помощи:
- Полное руководство:
ASYNC_LYNGSAT_GUIDE.md - Быстрый старт:
QUICKSTART_ASYNC.md - Документация Celery: https://docs.celeryproject.org/