Внимание:Тестовое задание найдено на просторах github-а. Для обучения и тренировки, попробовал решить ее в меру своего понимания. На ревью не отправлял, за оптимальность не ручаюсь.
Сервис сокращения ссылок
Задача
Создать сервис, который будет как укорачивать ссылку, так и по-короткой ссылке возвращать исходную.
Подробнее здесь
Нефункциональные требования
✅ В качестве хранилица использовать РСУБД(postgresql, sqllite)
postgresql можно запустить в docker:
docker run --rm -p 5432:5432 postgres:10.5 Выбран Sqlite3, файл создается в корне проекта и при достижении определенного в конфиге размера, пересоздается (чтобы не хостить БД и не перегружать тестовый стенд)
✅ Короткие ссылки должны основываться на id записи(sequence) в БД, переведённой в систему счисления с алфавитом [A-Za-z0-9]
Id ссылки в БД переводится в 62-ичную систему счисления 0-9a-zA-Z: https://p12s.ru/1N (p12s.ru - короткий домен из .env, 1N - перекодированный ID)
вместо стандартного net/http-пакета попробовать fasthttp
у него меньше аллокаций памяти и быстрее скорость за счет использования кодогенерации вместо рефлекции (текущий этап моих знаний)
в таблицу link добавить индексы для столбца short - получение длинной ссылки по ее короткой версии будет быстрее
забенчмаркать с помощью wrk для проверки производительности
отпрофилировать с помощью pprof и по-возможности, зарефакторить. А после снова забенчмаркать
type Link struct {
Id int `json:"id" db:"id"`
Url string `json:"url" db:"-"`
Short string `json:"short" db:"short" binding:"required"`
Long string `json:"long" db:"long" binding:"required"`
}