Skip to content

petr-stb/shortener

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Сокращатель ссылок

Краткое описание

Приложение разработано 08.01.2019 в соответствии с тестовым заданием на позицию стажер Java в СКБ-Контур.

Приложение Shortener представляет собой HTTP-сервис, который генерирует короткие ссылки.

Инструкция по сборке

Проект создан с использованием Spring Boot и Apache Maven. Один из вариантов сборки - выполнить следующую команду Maven, находясь в корневом каталоге проекта: "mvn clean install". Будет создан файл с расширением ".jar" в папке target, которая будет находиться в корневом каталоге проекта.

Инструкция по запуску

  1. Запустить в командной строке вновь созданный при сборке файл с расширением ".jar": java -jar shortener.jar
  2. Дождаться появления сообщения “SHORTENER IS STARTED” (может потребоваться от нескольких секунд до 1 минуты).
  3. Приложение готово к работе. В консоли периодически будет добавляться блок информации “Metrics for local node” (не имеет прямого отношения к пользовательскому функционалу приложения).
  4. Для иллюстрации работы приложения запросы следует отправлять в соответствии с заданием на адреса URL, аналогичные примерам ниже: http://localhost:8080/generate http://localhost:8080/l/FXPWUdxsa7M http://localhost:8080/stats/FXPWUdxsa7M http://localhost:8080/stats?page=2&count=15
  5. Для очистки базы данных введите в командной строке “clear”.
  6. Для безопасной остановки приложения введите в командной строке “exit”.

Описание особенностей решения

Сервис создан с использованием средств Spring MVC. Для сохранения данных используется база данных (БД) Apache Ignite в режиме встроенной БД. БД использует оперативную память, а также формирует хранилище на жестком диске для хранения данных после выключения приложения. Пример пути к базе данных на жестком диске в Windows 7: “c:\Users\User\AppData\Local\Temp\ignite\”.

Оптимизация работы со ссылками направлена на увеличение скорости выполнения запросов. Данная оптимизация реализована отчасти за счет промежуточного хранения данных в оперативной памяти.

При запросах проводится проверка валидности запросов. В случае неверного запроса формируется соответствующий http-статус.

При запросе “Генератор ссылок” приложение производит быстрый поиск оригинальной ссылки в HashMap. Данная HashMap формируется из данных БД при запуске приложения и пополняется при добавлении в БД новой ссылки. Если оригинальная ссылка не найдена, то генерируется новая уникальная короткая ссылка на основе текущего времени и порядкового номера, кодируется с помощью Base64 и сохраняется в БД и в HashMap. Пользователю возвращается или найденная короткая ссылка, или вновь сгенерированная.

При запросе “Редирект” оригинальная ссылка запрашивается из БД. Для увеличения скорости запроса факт перехода по короткой ссылке сохраняется в HashMap переходов, а не в БД. Данные из HashMap перегружаются в БД при выключении приложения и при сортировке, которая может вызываться при запросе статистики или рейтинга ссылок.

При запросе статистики ссылки или рейтинга ссылок данные из БД выгружаются, сортируются и сохраняются в ArrayList для быстрого доступа. Затем ссылкам в данном ArrayList проставляются значения rank. Данный ArrayList обновляется только тогда, когда имеются новые неучтенные переходы по ссылкам или добавлена новая ссылка (в целях оптимизации).

Приложение покрыто Unit-тестами с учетом различных сценариев поведения пользователя. (Выполнить тесты можно в IDE, запустив класс ShortenerControllerTest. Важно: при выполнении тестов БД очищается и заполняется тестовыми значениями.)

В приложении имеются тесты производительности некоторых методов. (Выполнить тесты можно в IDE, запустив класс BenchmarkRunner. Время выполнения – до несколько минут. Важно: при выполнении тестов БД очищается и заполняется тестовыми значениями.)

Автор решения – Деменев Петр

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages