Skip to content

trixter5/test-demo-fullstack-nest-vue-ts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Тестовый проект: Fullstack-приложение на NestJS и Vue

Этот проект представляет собой простое fullstack-приложение, состоящее из бэкенда на NestJS, фронтенда на Vue 3 и базы данных PostgreSQL. Все сервисы запускаются с помощью Docker.

Технологии

  • Backend: NestJS, TypeScript, TypeORM
  • Frontend: Vue 3, Vite
  • База данных: PostgreSQL
  • Контейнеризация: Docker, Docker Compose

Запуск проекта

Требования:

  • Docker и Docker Compose должны быть установлены на вашем компьютере.
  1. Клонируйте репозиторий:

    git clone <URL вашего репозитория>
    cd test-fullstack
  2. Запустите все сервисы с помощью Docker Compose: Эта команда соберет образы и запустит контейнеры в фоновом режиме.

    docker-compose up --build -d
  3. Заполните базу данных начальными данными: Выполните скрипт для заполнения базы данных 50 000 записями. Команда выполняется с вашего локального компьютера, но подключается к базе данных в Docker.

    cd backend
    npm install
    npm run seed
    cd ..

Доступ к приложению

  • Frontend (приложение для нагрузочного теста):

    • URL: http://localhost:5173 (Примечание: Фронтенд запускается в режиме разработки отдельно от Docker)
  • Backend API:

    • Базовый URL: http://localhost:3000
    • Пример эндпоинта: http://localhost:3000/items?limit=10&offset=0

Проведенные оптимизации

В ходе нагрузочного тестирования эндпоинта GET /items были выявлены узкие места и применены следующие оптимизации:

  1. Индекс в базе данных:

    • Проблема: Без индекса PostgreSQL выполнял полный просмотр таблицы (Full Table Scan) на 50 000 записей, что было медленно.
    • Решение: Был добавлен индекс на поле created_at с помощью миграции TypeORM. Это позволяет базе данных находить и сортировать записи значительно быстрее.
  2. Управление параллельными запросами на фронтенде:

    • Проблема: Попытка отправить тысячи запросов одновременно из браузера приводила к ошибке net::ERR_INSUFFICIENT_RESOURCES, так как у браузера заканчивались доступные сетевые сокеты.
    • Решение: Логика на фронтенде была переписана для создания "конвейера", который отправляет запросы контролируемыми пачками (например, по 50 одновременно), не перегружая браузер.
  3. Кэширование на стороне бэкенда:

    • Проблема: Даже с индексом каждый запрос заставлял бэкенд обращаться к базе данных, что создавало избыточную нагрузку.
    • Решение: Был внедрен встроенный в NestJS CacheModule. Теперь результат первого запроса к GET /items кэшируется в памяти на 10 секунд. Все последующие идентичные запросы в течение этого времени получают ответ мгновенно из кэша, без обращения к базе данных.

Результаты в цифрах (до/после)

  • До оптимизации кэшированием: ~5000 успешных запросов за ~17-18 секунд.
  • После оптимизации кэшированием: ~5000 успешных запросов за ~13 секунд.

Это демонстрирует улучшение производительности примерно на 25% только за счет добавления кэширования на стороне сервера.

About

Simple demo project: optimization queries

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published