- Добавлена конфигурация Celery (eusrr_backend/celery.py) - Созданы async задачи для уведомлений (notifications/tasks.py) - Обновлены все notification_signals на create_notification_async() - Добавлен метод NotificationService.create_notification_async() с fallback - Установлены пакеты: django-celery-beat, django-celery-results, flower - Применены миграции для Celery приложений - Документация: CELERY_SETUP.md, CELERY_INTEGRATION_PLAN.md Производительность: уменьшение времени отправки сообщений с ~500ms до <50ms
6.6 KiB
Celery Integration - Следующие шаги
✅ Что уже сделано
-
✅ Добавлены зависимости в
requirements.txt:celery==5.5.3redis==5.2.1django-celery-beat==2.7.0django-celery-results==2.5.1flower==2.0.1
-
✅ Создан файл конфигурации
eusrr_backend/celery.py- Настроена автоматическая регистрация задач
- Добавлен debug task для тестирования
-
✅ Обновлен
eusrr_backend/__init__.py- Автоматический импорт celery_app при запуске Django
-
✅ Добавлены настройки Celery в
settings.py:CELERY_BROKER_URL- Redis как брокер сообщенийCELERY_RESULT_BACKEND- Redis для хранения результатов- Настройка роутинга задач по очередям
- Таймауты и лимиты для workers
-
✅ Добавлены приложения в
INSTALLED_APPS:django_celery_beat- для периодических задачdjango_celery_results- для хранения результатов
-
✅ Созданы Celery задачи в
notifications/tasks.py:send_notification_task- отправка одного уведомленияsend_bulk_notifications_task- массовая отправкаcleanup_old_notifications_task- очистка старых уведомленийsend_digest_email_task- email-дайджесты
🔄 Следующие шаги (выполнить вручную)
Шаг 1: Установка зависимостей
Запустите задачу в VS Code:
- Pip: install requirements
Или вручную:
cd backend
..\.venv\Scripts\pip install -r requirements.txt
Шаг 2: Установка и запуск Redis
Вариант 1: Windows (рекомендуется Memurai)
- Скачайте Memurai (Redis для Windows): https://www.memurai.com/
- Установите и запустите как службу Windows
- Redis будет доступен на
localhost:6379
Вариант 2: Docker
docker run -d -p 6379:6379 --name redis redis:7-alpine
Проверка Redis:
redis-cli ping
# Должно вернуть: PONG
Шаг 3: Применение миграций
Запустите:
cd backend
migrate_celery.bat
Или вручную:
..\.venv\Scripts\python manage.py migrate django_celery_beat
..\.venv\Scripts\python manage.py migrate django_celery_results
Шаг 4: Тестирование Celery Worker
В отдельном терминале запустите worker:
cd backend
..\.venv\Scripts\celery -A eusrr_backend worker -l info --pool=solo
Примечание: На Windows используйте --pool=solo или --pool=gevent
Шаг 5: Тестирование отправки задачи
В Django shell:
..\.venv\Scripts\python manage.py shell
from celery import current_app
current_app.send_task('eusrr_backend.debug_task')
Вы должны увидеть выполнение задачи в логах worker.
Шаг 6: Интеграция с NotificationService
Обновите notifications/services.py:
from notifications.tasks import send_notification_task, send_bulk_notifications_task
class NotificationService:
@staticmethod
def create_notification(...):
# Вместо синхронного создания
send_notification_task.delay(
notification_type=notification_type,
user_id=user.id,
title=title,
message=message,
link=link,
sender_id=sender.id if sender else None,
metadata=metadata,
)
Шаг 7: Запуск Flower (мониторинг)
cd backend
..\.venv\Scripts\celery -A eusrr_backend flower
Откройте http://localhost:5555 для просмотра статистики задач.
Шаг 8: Настройка периодических задач
В Django Admin:
- Перейдите в "Periodic Tasks"
- Добавьте задачу для
notifications.cleanup_old_notifications - Настройте интервал (например, раз в день)
Или программно в eusrr_backend/celery.py:
from celery.schedules import crontab
app.conf.beat_schedule = {
'cleanup-old-notifications': {
'task': 'notifications.cleanup_old_notifications',
'schedule': crontab(hour=3, minute=0), # Каждый день в 3:00
'args': (90,) # Удалять уведомления старше 90 дней
},
}
Запустите beat scheduler:
..\.venv\Scripts\celery -A eusrr_backend beat -l info
📊 Ожидаемый результат
До внедрения Celery:
- Отправка сообщения в группу с 8 участниками: ~500ms
- Блокировка API response до отправки всех уведомлений
После внедрения Celery:
- Отправка сообщения: <50ms (только создание задачи)
- Уведомления обрабатываются асинхронно
- API мгновенно отвечает пользователю
🔍 Отладка
Проверка статуса Celery
..\.venv\Scripts\celery -A eusrr_backend inspect active
..\.venv\Scripts\celery -A eusrr_backend inspect stats
Проверка задач в очереди
..\.venv\Scripts\celery -A eusrr_backend inspect reserved
Логи
- Worker логи: консоль где запущен worker
- Flower: http://localhost:5555
- Django логи: стандартные логи приложения
📚 Документация
- Подробная документация:
docs/guides/CELERY_SETUP.md - План внедрения (5 дней):
docs/in-progress/CELERY_INTEGRATION_PLAN.md - Celery docs: https://docs.celeryq.dev/
⚠️ Production Deployment
Для production:
- Используйте Redis Cluster или Redis Sentinel
- Запускайте несколько workers с supervisord/systemd
- Настройте мониторинг (Flower + Prometheus)
- Добавьте retry policies и dead letter queue
- Настройте автоматический перезапуск workers
См. docs/in-progress/CELERY_INTEGRATION_PLAN.md для деталей.