Skip to content

stepan2volkov/urlshortener

Repository files navigation

URL Shortener

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

Cервис для сокращения ссылок на Go. В действии можно посмотреть на Heroku.

Описание алгоритма генерации коротких имен

Для генерации коротких имён используется base58. Для этого производится вставка в базу данных, в результате которой мы получаем целочисленный идентификатор URL в базе. Далее этот идентификатор переводится 58-ричную систему счисления.

Достоинства подхода:

  • Base58 не содержит символов, которые могут неоднозначно восприниматься
  • В отличие от Base64 не содержит символов + и /, которые являются зарезервированными символами для URI
  • Большой диапазон идентификаторов кодируются короткой строкой. Например, запись, которая будет иметь идентификатор равный одному квинтиллиону (1018), кодируется как 3jCDNijSNFA (11 символов)

Недостаток подхода:

  • Зависимость от целочисленного идентификатора БД, в связи с чем затруднен переход на UUID
  • Требуется выполнить две операции в БД: вставка записи (для получения ID), и её дальнейшее обновление (после конвертации ID в base58)

Для решения указанных недостатков можно использовать алгоритм генерации псевдослучайной короткой ссылки. В этом случае потребуется вставка записи в БД, и в случае неудачи по причине нарушения ограничения на уникальность колонки short_url - повторная генерация короткой ссылки. Коллизии должны быть сведены к минимуму, чтобы получить профит от нового алгоритма. В рамках данного проекта принято решение использовать простой алгоритм конвертации целочисленного ID в base58. Цель проекта - демонстрация знаний golang, поэтому выбранный алгоритм не играет значимой роли.

Выбор роутера

В качестве роутера выбран chi по следующим причинам:

  1. Быстрый и легковесный
  2. Реализует интерфейс http.Handler, поэтому является легко заменяемым на другие роутеры, реализующие стандартный интерфейс
  3. Активно поддерживается (на момент написания проекта)
  4. Хорошо описанное API

Конфигурирование приложения

Конфигурация приложения возможна как через yaml-файл, так и через переменные окружения. Для конфигурирования через файл следует использовать флаг -config="path-to-yaml". Если не указывать путь к файлу, то приложение будет искать настройки в переменных окружения. Пример конфигурирования через yaml-файл можно посмотреть в папке /config. Переменные окружения приведены ниже:

Переменная окружения Значение по-умолчанию Описание
PORT - Порт, на котором будет работать приложение
DSN memory Строка подключения к БД postgres
READ_TIMEOUT 30
WRITE_TIMEOUT 30
READ_HEADER_TIMEOUT 30

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published