Перейти к основному содержимому

Кейс сервиса

URL-сокращатель

Сервис редиректов, спроектированный вокруг горячего пути: хранение в PostgreSQL, Redis cache-aside с ограниченным фолбэком, per-instance singleflight и воспроизводимые бенчмарки задержек.

ЗапланированРантайм бэкенда: Нет развёрнутого рантайма — стадия спецификацииИсточник данных демо: Mock

Область применения
Бэкенд-кейс о горячем пути редиректа, стратегии кэширования и ограниченной аналитике для демо-окружения zolotoy.dev.
Не входит в область
  • Не клон Bitly.
  • Не шардированная аналитическая платформа.
  • Не универсальный продукт управления ссылками.
Инженерный фокус
Redis cache-aside, singleflight, горячий путь, ограниченная аналитика.

Инженерный фокус

Redis cache-aside, singleflight, горячий путь, ограниченная аналитика.

Текущая реализация

Бэкенд-реализации пока нет. Демо-модуль отображает планируемые потоки на детерминированных моках; содержимое ниже — предлагаемая граница, а не работающая система.

  • Current

    Бэкенд-реализации пока нет: демо отображает детерминированные MSW-сценарии управления ссылками и аналитики.

    • Спецификация URL-сокращателя (целевой контракт)docs/backend-specs/04_url_shortener.mdzolotoy-dev-frontend (this repository)проверено 2026-09-17

Целевая архитектура

  • Target

    Горячий путь редиректа: отдача из Redis cache-aside, фолбэк на PostgreSQL с ограниченной конкурентностью и ответы 404/410 по состоянию ссылки.

    • Спецификация URL-сокращателя (целевой контракт)docs/backend-specs/04_url_shortener.mdzolotoy-dev-frontend (this repository)проверено 2026-09-17
  • Target

    Инвалидация кэша при изменении ссылки, negative caching для отсутствующих ключей и ограничения TTL, ограничивающие устаревание после гонок инвалидации.

    • Спецификация URL-сокращателя (целевой контракт)docs/backend-specs/04_url_shortener.mdzolotoy-dev-frontend (this repository)проверено 2026-09-17
  • Target

    Per-instance singleflight сворачивает конкурентные промахи по одному ключу в одно чтение БД; между инстансами сервиса он не координирует.

    • Спецификация URL-сокращателя (целевой контракт)docs/backend-specs/04_url_shortener.mdzolotoy-dev-frontend (this repository)проверено 2026-09-17
  • Target

    Воспроизводимые бенчмарки задержек/пропускной способности с опубликованной методологией — измерение, а не маркетинговая цифра.

    • Спецификация URL-сокращателя (целевой контракт)docs/backend-specs/04_url_shortener.mdzolotoy-dev-frontend (this repository)проверено 2026-09-17
    • Веха производительности сокращателя: измерения и ограниченная аналитика (будущее)docs/roadmap.mdzolotoy-dev-backende36b1025проверено 2026-09-17

Архитектура / основной поток

Целевая
  • Браузер посетителяGET /{alias} — редирект
  • Shortener-сервисГорячий путь: кэш → фолбэк → редирект
  • RedisCache-aside + negative caching
  • PostgreSQLСсылки, состояние, ограниченная аналитика
  • GET алиаса: browser → svc
  • поиск cache-aside: svc → redis (план)
  • ограниченный фолбэк + singleflight: svc → db (план)
Целевой горячий путь редиректа: cache-aside и ограниченный фолбэк.

Инженерные решения

Negative caching ограничивает шторм отсутствующих ключей

Целевой дизайн: повторные запросы несуществующего алиаса кэшируют кратковременный отрицательный результат, чтобы атакующие или «горячие» мёртвые ссылки не обходили кэш в обход БД.

Singleflight — per-instance по дизайну

Целевой дизайн: слияние in-flight запросов убирает дублирующиеся промахи внутри инстанса. Межинстансовая координация добавила бы распределённый лок на горячий путь — отклонено; эту роль выполняет ограниченная конкурентность фолбэка.

Аналитика — best-effort и ограниченная

Целевой дизайн: счётчики кликов инкрементируются асинхронно и при сбоях могут терять данные; корректность редиректа никогда не зависит от аналитики.

Надёжность / сценарии отказа

Коллизия уникального ключа
Сгенерированный алиас конфликтует при вставке: ретрай с новым ключом под ограничением уникальности; выбранные пользователем алиасы дают конфликт вида 409 вместо перезаписи.
Недоступность Redis и ограниченный фолбэк на БД
Redis недоступен: редиректы продолжаются через PostgreSQL с лимитами конкурентности (вероятно, с деградацией задержек) вместо отказа или неконтролируемого шторма.
Гонки инвалидации/перезаписи
Чтение перезаписывает устаревшее значение после инвалидации; TTL ограничивает, как долго устаревшая запись может вводить в заблуждение. Инвалидация не подаётся как свободная от гонок.
Политика для истёкших/отключённых ссылок
Истёкшие ссылки отвечают 410 Gone, отключённые или удалённые — 404; это различие — часть API-контракта, а не деталь UI.
Потери best-effort-аналитики
Под нагрузкой или при сбоях инкременты аналитики могут теряться; дашборды помечают числа как ограниченные оценки, а не точные счётчики.

Доказательства

  • Спецификация URL-сокращателя (целевой контракт)docs/backend-specs/04_url_shortener.mdzolotoy-dev-frontend (this repository)проверено 2026-09-17
  • Веха производительности сокращателя: измерения и ограниченная аналитика (будущее)docs/roadmap.mdzolotoy-dev-backende36b1025проверено 2026-09-17

Интерактивное демо

Следующая веха: Производительность сокращателя

Горячий путь редиректа через БД, фолбэк на Redis, per-instance singleflight, воспроизводимые измерения и ограниченная аналитика.

Критерии приёмки (план):

  • Методология бенчмарков и артефакты опубликованы
  • Сценарий недоступности Redis ограничен и измерен