#Реализация высоконагруженного проекта "Форумы"
Предметная область и инфологическая модель:
- Пользователь (Никнейм, E-Mail, Полное имя, Описание)
- Форум (Название, Slug, Автор (Никнейм пользователя), Количество постов, Количество веток)
- Тред / Ветка обсуждения - (Название, Slug, Сообщение/Описание, Рейтинг, Автор (Никнейм пользователя), Форум (Slug), Дата создания)
- Пост / Сообщение - (Родительское сообщение (Id), Текст сообщения, Автор (Никнейм пользователя), Тред (FK - Id), Форум (Slug), Дата создания, Флаг редактирования)
- Голос (Пользователь (FK - Id), Тред (FK - Id), Оценка (1 / -1))
API сервиса представлено в ТЗ ниже.
В процессе реализации были разработаны:
База данных на PostgreSQL 10.10
Backend API сервиса на GoLang 1.13.4
Сборка и запуск проекта: Локально:
- Сборка:
make build
- Запуск:
./db-forum-kosenkov
Docker:
- Сборка:
sudo docker build . -t amour/techno-db-forum
- Запуск (первый раз):
sudo docker run -p 5000:5000 --name amour -t amour/techno-db-forum
- Запуск (последующие разы):
sudo docker start amour
- Остановка контейнера:
sudo dovker stop amour
- Удаление контейнера:
sudo docker rm amour
Нагрузочное и функциональное тестирование производится программами из репозитория: https://github.com/bozaro/tech-db-forum
После скачивания запустить go build .
Команды тестирования:
- функциональное:
./tech-db-forum func --url http://localhost:5000/api
- нагрузочное (8 потоков):
./tech-db-forum perf --url http://localhost:5000/api -i -t=8
Результат тестирования: 2602 rps
Конфигурация:
- ЦП - AMD Ryzen 5 2500U 3.6 Ghz
- ОЗУ - 12 ГБ
- HDD - 1 ТБ 5400 об/мин
Тестовое задание для реализации проекта "Форумы" на курсе по базам данных в Технопарке Mail.ru (https://park.mail.ru).
Суть задания заключается в реализации API к базе данных проекта «Форумы» по документации к этому API.
На входе:
- документация к API;
На выходе:
- репозиторий, содержащий все необходимое для разворачивания сервиса в Docker-контейнере.
Документация к API предоставлена в виде спецификации OpenAPI: swagger.yml
https://tech-db-forum.bozaro.ru/
Проект должен включать в себя все необходимое для разворачивания сервиса в Docker-контейнере.
При этом:
- файл для сборки Docker-контейнера должен называться Dockerfile и располагаться в корне репозитория;
- реализуемое API должно быть доступно на 5000-ом порту по протоколу http;
- допускается использовать любой язык программирования;
- крайне не рекомендуется использовать ORM.
Контейнер будет собираться из запускаться командами вида:
docker build -t a.navrotskiy https://github.com/bozaro/tech-db-forum-server.git
docker run -p 5000:5000 --name a.navrotskiy -t a.navrotskiy
В качестве отправной точки можно посмотреть на примеры реализации более простого API на различных языках программирования: https://github.com/bozaro/tech-db-hello/
Корректность API будет проверяться при помощи автоматического функционального тестирования.
Методика тестирования:
- собирается Docker-контейнер из репозитория;
- запускается Docker-контейнер;
- запускается скрипт на Go, который будет проводить тестирование;
- останавливается Docker-контейнер.
Скомпилированные программы для тестирования можно скачать по ссылкам:
Для локальной сборки Go-скрипта достаточно выполнить команду:
go get -u -v github.com/bozaro/tech-db-forum
go build github.com/bozaro/tech-db-forum
После этого в текущем каталоге будет создан исполняемый файл tech-db-forum
.
Для запуска функционального тестирования нужно выполнить команду вида:
./tech-db-forum func -u http://localhost:5000/api -r report.html
Поддерживаются следующие параметры:
Параметр | Описание |
---|---|
-h, --help | Вывод списка поддерживаемых параметров |
-u, --url[=http://localhost:5000/api] | Указание базовой URL тестируемого приложения |
-k, --keep | Продолжить тестирование после первого упавшего теста |
-t, --tests[=.*] | Маска запускаемых тестов (регулярное выражение) |
-r, --report[=report.html] | Имя файла для детального отчета о функциональном тестировании |