shorter

package module
v0.0.0-...-2436070 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 3, 2021 License: MIT Imports: 0 Imported by: 0

README

License GitHub go.mod Go version Coverage Status Go Report Card

Внимание: Тестовое задание найдено на просторах github-а. Для обучения и тренировки, попробовал решить ее в меру своего понимания. На ревью не отправлял, за оптимальность не ручаюсь.

Сервис сокращения ссылок

Задача

Создать сервис, который будет как укорачивать ссылку, так и по-короткой ссылке возвращать исходную.
Подробнее здесь

Нефункциональные требования

  • ✅ В качестве хранилица использовать РСУБД(postgresql, sqllite)
    postgresql можно запустить в docker:
    docker run --rm -p 5432:5432 postgres:10.5
    Выбран Sqlite3, файл создается в корне проекта и при достижении определенного в конфиге размера, пересоздается (чтобы не хостить БД и не перегружать тестовый стенд)
  • ✅ В качестве структуры веб сервиса - https://github.com/golang-standards/project-layout
  • ✅ Сервис можно реализовать как стандартной библиотекой(net/http), так и фреймворками gin, echo
    Выбран пакет net/http с нативной реализацией роутинга
  • ✅ Запросы в БД на pure sql, либо https://github.com/Masterminds/squirrel
  • ✅ Короткие ссылки должны основываться на id записи(sequence) в БД, переведённой в систему счисления с алфавитом [A-Za-z0-9] Id ссылки в БД переводится в 62-ичную систему счисления 0-9a-zA-Z: https://p12s.ru/1N (p12s.ru - короткий домен из .env, 1N - перекодированный ID)

Запуск

make build
make s  # s - server

Документация должна открыться по адресу:
http://localhost:80/swagger/index.html
Экспортированная коллекция postman здесь

Дополнительные улучшения

  • Не используются фреймворки, роутинг на net/http
  • Добавлена документация с помощью http-swagger

Что можно усовершенствовать

  • вместо стандартного net/http-пакета попробовать fasthttp
    у него меньше аллокаций памяти и быстрее скорость за счет использования кодогенерации вместо рефлекции (текущий этап моих знаний)
  • в таблицу link добавить индексы для столбца short - получение длинной ссылки по ее короткой версии будет быстрее
  • забенчмаркать с помощью wrk для проверки производительности
  • отпрофилировать с помощью pprof и по-возможности, зарефакторить. А после снова забенчмаркать

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

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"`
}

Link - основная сущность сервиса - ссылка

type UserLink struct {
	Url string `json:"url" binding:"required"`
}

UserLink - сущность для получения запроса клиента и отправки ответа

Directories

Path Synopsis
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL