Вводные:
- Здесь представлен MVP проект файлообменника. Он позволяет загружать файлы, проверяет их на подозрительный контент и отправляет алерты;
- Репозиторий содержит в себе бэкенд и фронтенд части;
- В обоих частях присутствуют баги, неоптимизированный код, неудачные архитектурные решения.
Задачи:
- Проведите рефакторинг бэкенда, не ломая бизнес-логики: предложите свое видение архитектуры и реализуйте его;
- (Дополнительно) На бэкенде есть возможность неочевидной оптимизации - выполните ее;
- (Дополнительно) Разбейте логику фронтенда на слои;
Проект эволюционировал от простого прототипа на FastAPI до более структурированного сервиса обработки файлов.
Ключевые решения по реализации:
-
Асинхронный уровень API FastAPI
- Сессии базы данных вводятся с помощью зависимостей FastAPI.
- Операции с файловой системой переносятся в фоновые потоки (to_thread), чтобы избежать блокировки цикла событий.
-
Безопасная загрузка файлов
- Загруженные файлы записываются с использованием потоковой передачи частями вместо загрузки всего файла в память.
- Создание файла разделено на этапы сохранения в файловой системе и сохранения в базе данных.
- Сохраненные файлы удаляются в случае сбоя валидации или сбоя при сохранении в базе данных.
-
Улучшения базы данных
- Переход с моделей SQLAlchemy на модели SQLModel.
- Добавлены соответствующие типы перечислений (enum) для processing_state, scan_state, и alert_level.
- Драйвер базы данных сменён с
asyncpgнаpsycopg. Это позволяет использовать один и тот же драйвер как для синхронного так и для асинхронного доступа к базе данных. - В качестве идентификаторов файлов используются UUID.
-
Фоновая обработка
- Рабочий процесс (worker) использует синхронные сессии SQLAlchemy, что позволяет избежать ненужного управления асинхронным циклом событий (event loop) в фоновых задачах.
- Использууются цепи (chain) из Celery Canvas вместо вызова задач одной из другой.
-
Организация кода
- Конфигурация базы данных была отделена от сервизного слоя.
- Повторяющаяся логика была объединена.
- Были усовершенствованы очистка ресурсов и обработка транзакций с неявным откатом.
Запуск:
docker compose -f docker-compose.dev.yml updocker exec -it backend alembic upgrade head
Открыть фронт: http://localhost:3000/test
Открыть бэк: http://localhost:8000/docs