Настроил сеелери, начал привязку lyngsat
This commit is contained in:
@@ -1,396 +1,396 @@
|
||||
# Сводка изменений: Асинхронная обработка данных 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/
|
||||
# Сводка изменений: Асинхронная обработка данных 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/
|
||||
|
||||
Reference in New Issue
Block a user