Files
dbstorage/ASYNC_CHANGES_SUMMARY.md

13 KiB
Raw Blame History

Сводка изменений: Асинхронная обработка данных 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

  1. dbapp/mainapp/templates/mainapp/lyngsat_task_status.html - страница отслеживания прогресса

Документация

  1. ASYNC_LYNGSAT_GUIDE.md - полное руководство
  2. QUICKSTART_ASYNC.md - быстрый старт
  3. 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 логика

  1. dbapp/lyngsatapp/utils.py

    • Добавлено: параметр task_id для логирования
    • Добавлено: параметр update_progress для обновления прогресса
    • Добавлено: детальное логирование на всех уровнях
    • Добавлено: логирование каждые 10 источников
    • Улучшено: обработка ошибок с логированием
  2. dbapp/mainapp/views.py

    • Изменено: FillLyngsatDataView теперь запускает асинхронную задачу
    • Добавлено: LyngsatTaskStatusView - страница отслеживания
    • Добавлено: LyngsatTaskStatusAPIView - API для проверки статуса
  3. 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

Поток данных

  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/<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

Зависимости

Обязательные сервисы

  1. Redis - брокер сообщений Celery
  2. FlareSolver - обход Cloudflare
  3. 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 - метрики и дашборды

Безопасность

Рекомендации

  1. Используйте пароль для Redis в production
  2. Ограничьте доступ к Redis только для localhost
  3. Используйте SSL для Redis в production
  4. Ограничьте время выполнения задач
  5. Логируйте все действия

Пример конфигурации 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

Следующие шаги

  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/