397 lines
13 KiB
Markdown
397 lines
13 KiB
Markdown
# Сводка изменений: Асинхронная обработка данных 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/<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>/
|
||
|
||
**Ответ при выполнении:**
|
||
```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/
|