tinkoff-ab-1
ТЗ
Разработать REST сервис для хранения паролей. Формат запросов/ответов - JSON.
Сервис должен поддерживать следующие операции:
- Создать новую запись. На вход принимать название записи*, логин, пароль*, ссылка // * обязательные поля
- Получить список всех записей - метод должен возвращать только id и названия. Должна быть версия с пагинацией
- Получить конкретную запись - возвращает все поля
- Обновить запись по Id
Добавить аутентификацию и авторизацию. Для авторизации использовать Spring Security + JWT.
У пользователя должна быть возможность:
- Зарегистрироваться
- Залогиниться по своему имени и паролю
Записи о паролях должны принадлежать пользователю, который их создает. Пользователь не должен иметь доступ к чужим паролям.
Добавить возможность делиться записями.
Например:
- У пользователя Alice есть запись (id 1, login, password). Пользователь Alice вызывает метод поделиться, получает в ответ токен. Этот токен передает пользователю Bob
- Пользователь Bob вызывает метод получение записи по этому токену. Запись копируется в его хранилище
Токен должен быть одноразовым. Т.е. второй раз по нему нельзя получить запись.
Нужно обрабатывать ситуацию, когда два пользователя пытаются одновременно открыть запись по токену. Получить запись должен только 1 пользователь - 2 получить ошибку.
При создании токена должна быть возможность указать время его жизни. Если Боб пытается получить запись по токену позже этого времени - он должен получить ошибку. Сделать автоочистку мертвых или просроченных токенов.
Добавить метрики.
Подключить spring-boot-actuator и micrometer в проект. Поднять локально Grafana и Prometheus. Импортировать готовый дэшборд (https://grafana.com/grafana/dashboards/4701-jvm-micrometer)
К готовому дэшборду добавить следующие кастомные графики:
- Кол-во попыток получить пошаренную запись по просроченному токену
- Кол-во попыток получить пошаренную запись по уже использованному токену
- Время от создания токена на шаринг до его использования - с 4 линиями на графике 0.5, 0.8, 0.95, 0.99 перцентили
Добавить возможность создавать иерархию:
- Добавить метод создания директории. Принимать как опциональный параметр ID существующей директории, в которой создаем вложенную директорию. Если не передали - создаем в корнею.
- В метод создания записи добавить возможность передать ID директории. Если не передали ID - создаем в корневой директории пользователя
- В метод получения записей добавить параметр ID директории. Выводим записи только непосредственно из этой директории. Если не передали - выводим из корня
- Добавить возможность менять директорию, в которой лежит запись
- Добавить метод, возвращающий список вложенных директорий по ID директории, если не передали ID - возвращать список для корня
С помощью JMeter провести тестирование производительности своего проекта.
Тест должен выглядеть следующим образом:
- 5 потоков
- Каждый поток состоит из запросов:
- Регистрация
- Авторизация
- Создание записи 20 раз с таймаутом 300мс
- Чтение всех своих записей 10 раз с таймаутом 300мс
Начать запускать с максимальным размером кучи 512мб (-Xmx512m) и постепенно уменьшать, пытаясь найти минимальное значение, при котором приложение не падает с ОММ
Результаты домашней работы №10
- Главным требованием было сбор метрик с помощью Prometheus и построение графиков с помощью Grafana.
- Итоговые результаты доступны в этой папке.
Результаты домашней работы №12
- Все результаты находятся в этой папке
- Наименьший размер кучи, для которого JMeter не падает с OMM оказался равным 27 Мб. Для 26 МБ приложение падает на середине отправки всех запросов.
- Графики получились не очень похожими на то, что в примере, однако достаточно информативными. В целом, самое интересное происходит в пару секунд после запуска тредпула в JMeter.
- Файл с конфигурацией JMeter лежит тут.
Куча с размером 27 МБ
Для этого размера кучи я сделал 3 картинки (они лежат в папке 27 MB):
- Grafana - График GC
- Grafana - График GC во время срабатывания автоматической очистки просроченных токенов
- VisualVM - График использованной хипом памяти
Куча с размером 512 МБ
А здесь получилось 4 картинки (они, соответственно, лежат в папке 512 MB):
- Grafana - Сравнение размеров двух хипов с помощью работы GC
- Grafana - График GC
- Grafana - График GC во время срабатывания автоматической очистки просроченных токенов
- VisualVM - График использованной хипом памяти