Cервис для сокращения ссылок на Go. В действии можно посмотреть на Heroku.
Для генерации коротких имён используется base58. Для этого производится вставка в базу данных, в результате которой мы получаем целочисленный идентификатор URL в базе. Далее этот идентификатор переводится 58-ричную систему счисления.
Достоинства подхода:
- Base58 не содержит символов, которые могут неоднозначно восприниматься
- В отличие от Base64 не содержит символов
+
и/
, которые являются зарезервированными символами для URI - Большой диапазон идентификаторов кодируются короткой строкой. Например, запись, которая будет иметь идентификатор равный одному квинтиллиону (1018), кодируется как
3jCDNijSNFA
(11 символов)
Недостаток подхода:
- Зависимость от целочисленного идентификатора БД, в связи с чем затруднен переход на UUID
- Требуется выполнить две операции в БД: вставка записи (для получения ID), и её дальнейшее обновление (после конвертации ID в base58)
Для решения указанных недостатков можно использовать алгоритм генерации псевдослучайной короткой ссылки. В этом случае потребуется вставка записи в БД, и в случае неудачи по причине нарушения ограничения на уникальность колонки short_url
- повторная генерация короткой ссылки. Коллизии должны быть сведены к минимуму, чтобы получить профит от нового алгоритма. В рамках данного проекта принято решение использовать простой алгоритм конвертации целочисленного ID в base58. Цель проекта - демонстрация знаний golang, поэтому выбранный алгоритм не играет значимой роли.
В качестве роутера выбран chi по следующим причинам:
- Быстрый и легковесный
- Реализует интерфейс http.Handler, поэтому является легко заменяемым на другие роутеры, реализующие стандартный интерфейс
- Активно поддерживается (на момент написания проекта)
- Хорошо описанное API
Конфигурация приложения возможна как через yaml-файл, так и через переменные окружения. Для конфигурирования через файл следует использовать флаг -config="path-to-yaml"
. Если не указывать путь к файлу, то приложение будет искать настройки в переменных окружения. Пример конфигурирования через yaml-файл можно посмотреть в папке /config
. Переменные окружения приведены ниже:
Переменная окружения | Значение по-умолчанию | Описание |
---|---|---|
PORT | - | Порт, на котором будет работать приложение |
DSN | memory | Строка подключения к БД postgres |
READ_TIMEOUT | 30 | |
WRITE_TIMEOUT | 30 | |
READ_HEADER_TIMEOUT | 30 |