Сокращатель ссылок. Техразбор #2
А вы задумывались, как считают переходы по ссылкам?
Есть два основных способа:
🔸 UTM-метки – дописываешь к ссылке ?utm_source=telegram&utm_campaign=... и смотришь в аналитике.
🔸 Сокращатель ссылок – как пример, bit.ly. Ты переходишь по короткой ссылке, сервис записывает клик и перенаправляет тебя дальше.
Вот второй вариант и разберём. Нашёл репозиторий на FastAPI + PostgreSQL – типовое решение, которое часто спрашивают на собесах по System Design.
В этот раз в репозитории документации не было – ни диаграмм, ни схем. Так что сделал сам для вас. Посмотрите
Что оно умеет:
🔸Сократить ссылку
🔸Редирект + подсчёт кликов
🔸Посмотреть куда ведёт ссылка без перехода (peek)
🔸Включить/выключить ссылку
🔸Регистрация, JWT-авторизация
🔸Админка: бан юзеров, просмотр всех ссылок
Структура репозитория
url-shortener2/
├── resources/ # роуты API (auth, urls, users)
├── managers/ # бизнес-логика
├── models/ # модели SQLAlchemy (User, URL)
├── schemas/ # валидация Pydantic
├── migrations/ # миграции Alembic
├── config/ # настройки из .env
├── main.py # точка входа FastAPI
└── api-admin # CLI для создания юзеров
Как работает:
1. Поднимаем PostgreSQL, прописываем креды от учетных записей в .env, накатываем миграции. (в общем, разворачиваем все это счастье на сервере)
2. Пользователь регистрируется (POST /register) – пароль хешируется через bcrypt, на почту летит код верификации. После логина получает JWT токен на 120 минут + refresh на 30 дней.
3. Создаёт короткую ссылку (POST /create) — сервис генерирует случайный ключ через secrets.token_urlsafe(), проверяет что такого ещё нет в базе, сохраняет вместе с user_id.
4. Кто-то переходит по короткой ссылке (GET /K3M9X) – сервис ищет ключ в базе, делает clicks += 1 и возвращает HTTP 302 Redirect на оригинальный URL.
5. Есть ещё peek – позволяет посмотреть, куда ведёт ссылка без перехода. И activate/deactivate – мягкое удаление.
Почему такая архитектура?
(смотрим на диаграмму контейнеров c4)
Это решение для небольшой нагрузки – десятки-сотни запросов в секунду. Каждый редирект делает два обращения к базе: SELECT + UPDATE счётчика.
Для highload (тысячи запросов в секунду) добавляют:
🔸 Redis – кэш горячих ссылок, чтобы не дёргать PostgreSQL на каждый клик
🔸 Асинхронный счётчик – пишем клики в очередь, а в базу сбрасываем пачками
🔸 Шардирование – распределяем ссылки по нескольким базам
Но для pet-проекта или внутреннего сервиса текущего решения хватит с запасом.
Сценарии
Нарисовал sequence-диаграммы для трёх основных флоу:
🔸 Создание ссылки
🔸 Редирект
🔸 Регистрация + логин
Написал небольшой UI, из коробки его не было =)
Поиграться можно тут: https://short.analystexe.ru/
Логин/пароль:
user1@analystexe.ru / 8AHoCzPdPJy8CA
Создавайте ссылки, смотрите, как устроен API, через Swagger
Исходники: github.com/seapagan/url-shortener2
Лайки = продолжение, помните об этом
@analyst_exe