# Сводка изменений: Асинхронная обработка данных Lyngsat ## Обзор Реализована полная асинхронная обработка данных Lyngsat с использованием Celery, Redis и детальным логированием. ## Ключевые улучшения ### 1. ✅ Асинхронная обработка - Задачи выполняются в фоновом режиме - Веб-интерфейс не блокируется - Можно обрабатывать несколько задач одновременно ### 2. ✅ Отслеживание прогресса - Прогресс-бар в реальном времени - Текущий статус обработки - Процент выполнения ### 3. ✅ Детальное логирование - Логи на уровне задачи - Логи на уровне спутника - Логи на уровне источника - Все ошибки записываются в лог ### 4. ✅ Результаты и статистика - Количество обработанных спутников - Количество обработанных источников - Количество созданных/обновленных записей - Список всех ошибок ## Новые файлы ### Backend 1. **dbapp/dbapp/celery.py** - конфигурация Celery 2. **dbapp/dbapp/__init__.py** - инициализация Celery app 3. **dbapp/lyngsatapp/tasks.py** - асинхронная задача заполнения данных 4. **dbapp/start_celery_worker.sh** - скрипт запуска worker ### Frontend 5. **dbapp/mainapp/templates/mainapp/lyngsat_task_status.html** - страница отслеживания прогресса ### Документация 6. **ASYNC_LYNGSAT_GUIDE.md** - полное руководство 7. **QUICKSTART_ASYNC.md** - быстрый старт 8. **ASYNC_CHANGES_SUMMARY.md** - этот файл ## Измененные файлы ### Конфигурация 1. **dbapp/requirements.txt** - Добавлено: `celery>=5.4.0` - Добавлено: `django-celery-results>=2.5.1` 2. **dbapp/dbapp/settings/base.py** - Добавлено: `django_celery_results` в INSTALLED_APPS - Добавлено: полная конфигурация Celery (брокер, результаты, таймауты, логирование) 3. **docker-compose.yaml** - Добавлено: сервис Redis - Добавлено: сервис FlareSolver - Добавлено: volume для Redis ### Backend логика 4. **dbapp/lyngsatapp/utils.py** - Добавлено: параметр `task_id` для логирования - Добавлено: параметр `update_progress` для обновления прогресса - Добавлено: детальное логирование на всех уровнях - Добавлено: логирование каждые 10 источников - Улучшено: обработка ошибок с логированием 5. **dbapp/mainapp/views.py** - Изменено: `FillLyngsatDataView` теперь запускает асинхронную задачу - Добавлено: `LyngsatTaskStatusView` - страница отслеживания - Добавлено: `LyngsatTaskStatusAPIView` - API для проверки статуса 6. **dbapp/mainapp/urls.py** - Добавлено: `/lyngsat-task-status/` - страница статуса - Добавлено: `/lyngsat-task-status//` - статус конкретной задачи - Добавлено: `/api/lyngsat-task-status//` - API endpoint ## Технические детали ### Архитектура ``` User Request → Django View → Celery Task → Redis Broker ↓ Celery Worker ↓ ┌───────────┴───────────┐ ↓ ↓ LyngSat Parser PostgreSQL ↓ ↓ FlareSolver Save Results ``` ### Поток данных 1. **Пользователь отправляет форму** - Django view получает данные - Создается асинхронная задача Celery - Возвращается task_id - Перенаправление на страницу статуса 2. **Celery Worker обрабатывает задачу** - Логирует начало обработки - Вызывает `fill_lyngsat_data` с callback - Обновляет прогресс через `update_state` - Логирует каждый шаг - Сохраняет результат в кеш 3. **Страница статуса отслеживает прогресс** - 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// **Ответ при выполнении:** ```json { "task_id": "abc123", "state": "PROGRESS", "status": "Обработка Astra 4A...", "current": 1, "total": 2, "percent": 50 } ``` **Ответ при успехе:** ```json { "task_id": "abc123", "state": "SUCCESS", "status": "Задача завершена успешно", "result": { "total_satellites": 2, "total_sources": 300, "created": 250, "updated": 50, "errors": [] } } ``` **Ответ при ошибке:** ```json { "task_id": "abc123", "state": "FAILURE", "status": "Ошибка при выполнении задачи", "error": "Connection timeout" } ``` ## Настройки Celery ### Основные параметры ```python 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`: ```bash CELERY_BROKER_URL=redis://redis:6379/0 ``` ## Зависимости ### Обязательные сервисы 1. **Redis** - брокер сообщений Celery 2. **FlareSolver** - обход Cloudflare 3. **PostgreSQL** - хранение данных и результатов ### Python пакеты - `celery>=5.4.0` - асинхронная обработка - `django-celery-results>=2.5.1` - хранение результатов - `redis>=6.4.0` - клиент Redis ## Команды для работы ### Запуск сервисов ```bash # 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 ``` ### Мониторинг ```bash # Просмотр логов tail -f dbapp/logs/celery_worker.log # Flower (веб-интерфейс) pip install flower celery -A dbapp flower # Откройте http://localhost:5555 ``` ### Отладка ```bash # Проверка 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 сервис ```bash sudo systemctl enable celery-worker sudo systemctl start celery-worker sudo systemctl status celery-worker ``` ### Supervisor ```bash sudo supervisorctl start celery-worker sudo supervisorctl status celery-worker ``` ### Docker Можно добавить Celery worker в docker-compose.yaml: ```yaml celery-worker: build: ./dbapp command: celery -A dbapp worker --loglevel=info depends_on: - redis - db environment: - CELERY_BROKER_URL=redis://redis:6379/0 ``` ## Тестирование ### Проверка системы ```bash # 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 ``` ### Тестовый запуск ```python # 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** - метрики и дашборды ## Безопасность ### Рекомендации 1. Используйте пароль для Redis в production 2. Ограничьте доступ к Redis только для localhost 3. Используйте SSL для Redis в production 4. Ограничьте время выполнения задач 5. Логируйте все действия ### Пример конфигурации Redis с паролем ```python CELERY_BROKER_URL = 'redis://:password@localhost:6379/0' ``` ## Масштабирование ### Горизонтальное масштабирование Запустите несколько workers: ```bash # 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 ``` ### Приоритеты задач Можно настроить разные очереди для разных типов задач: ```python @shared_task(queue='high_priority') def urgent_task(): pass @shared_task(queue='low_priority') def background_task(): pass ``` ## Следующие шаги 1. ✅ Применить миграции 2. ✅ Запустить Redis и FlareSolver 3. ✅ Запустить Celery Worker 4. ✅ Протестировать через веб-интерфейс 5. ⏳ Настроить production окружение 6. ⏳ Добавить периодические задачи (Celery Beat) 7. ⏳ Настроить email уведомления 8. ⏳ Настроить мониторинг (Flower) ## Заключение Система асинхронной обработки данных Lyngsat обеспечивает: - ✅ Неблокирующий веб-интерфейс - ✅ Отслеживание прогресса в реальном времени - ✅ Детальное логирование всех операций - ✅ Масштабируемость (несколько workers) - ✅ Надежность (retry при ошибках) - ✅ Мониторинг и отладка - ✅ Production-ready решение Для получения дополнительной помощи: - Полное руководство: `ASYNC_LYNGSAT_GUIDE.md` - Быстрый старт: `QUICKSTART_ASYNC.md` - Документация Celery: https://docs.celeryproject.org/