TGViewer
analyst_exe | инженерное мышление в IT analyst_exe | инженерное мышление в IT @analyst_exe · 511 subscribers
Post #543 315
Сокращатель ссылок. Техразбор #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
  • 🔥 6
  • ❤ 4
  • 👏 1
More from @analyst_exe
  1. Sep 25, 2026В ТЗ написано: «Всё работает как обычно». У нас уже 17 уточняющих вопросов к слову «обычно…
  2. Sep 24, 2026Уволил себя #1. С должности рисовальщика диаграмм) Тут ИИ меня реально заменил. Теперь я ц…
  3. Sep 21, 2026Ну это не дело, сами из резюме вытащить не могут? @analyst_exe
  4. Sep 20, 202614 моделей рисуют BPMN. Кто рабочая лошадь, а кто заставит зайца ждать? Взял историю про П…
  5. Sep 20, 2026Есть идеи, чем я таким сижу занимаюсь? Пишите варианты в комментариях) @analyst_exe
  6. Sep 19, 2026В субботу отдыхаем честно украденным мемом @analyst_exe
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →