Этот проект представляет собой простое fullstack-приложение, состоящее из бэкенда на NestJS, фронтенда на Vue 3 и базы данных PostgreSQL. Все сервисы запускаются с помощью Docker.
- Backend: NestJS, TypeScript, TypeORM
- Frontend: Vue 3, Vite
- База данных: PostgreSQL
- Контейнеризация: Docker, Docker Compose
Требования:
- Docker и Docker Compose должны быть установлены на вашем компьютере.
-
Клонируйте репозиторий:
git clone <URL вашего репозитория> cd test-fullstack
-
Запустите все сервисы с помощью Docker Compose: Эта команда соберет образы и запустит контейнеры в фоновом режиме.
docker-compose up --build -d
-
Заполните базу данных начальными данными: Выполните скрипт для заполнения базы данных 50 000 записями. Команда выполняется с вашего локального компьютера, но подключается к базе данных в Docker.
cd backend npm install npm run seed cd ..
-
Frontend (приложение для нагрузочного теста):
- URL:
http://localhost:5173(Примечание: Фронтенд запускается в режиме разработки отдельно от Docker)
- URL:
-
Backend API:
- Базовый URL:
http://localhost:3000 - Пример эндпоинта:
http://localhost:3000/items?limit=10&offset=0
- Базовый URL:
В ходе нагрузочного тестирования эндпоинта GET /items были выявлены узкие места и применены следующие оптимизации:
-
Индекс в базе данных:
- Проблема: Без индекса PostgreSQL выполнял полный просмотр таблицы (
Full Table Scan) на 50 000 записей, что было медленно. - Решение: Был добавлен индекс на поле
created_atс помощью миграции TypeORM. Это позволяет базе данных находить и сортировать записи значительно быстрее.
- Проблема: Без индекса PostgreSQL выполнял полный просмотр таблицы (
-
Управление параллельными запросами на фронтенде:
- Проблема: Попытка отправить тысячи запросов одновременно из браузера приводила к ошибке
net::ERR_INSUFFICIENT_RESOURCES, так как у браузера заканчивались доступные сетевые сокеты. - Решение: Логика на фронтенде была переписана для создания "конвейера", который отправляет запросы контролируемыми пачками (например, по 50 одновременно), не перегружая браузер.
- Проблема: Попытка отправить тысячи запросов одновременно из браузера приводила к ошибке
-
Кэширование на стороне бэкенда:
- Проблема: Даже с индексом каждый запрос заставлял бэкенд обращаться к базе данных, что создавало избыточную нагрузку.
- Решение: Был внедрен встроенный в NestJS
CacheModule. Теперь результат первого запроса кGET /itemsкэшируется в памяти на 10 секунд. Все последующие идентичные запросы в течение этого времени получают ответ мгновенно из кэша, без обращения к базе данных.
- До оптимизации кэшированием: ~5000 успешных запросов за ~17-18 секунд.
- После оптимизации кэшированием: ~5000 успешных запросов за ~13 секунд.
Это демонстрирует улучшение производительности примерно на 25% только за счет добавления кэширования на стороне сервера.