Все проекты

URL Shortener

Рефакторинг NodeJS → Java. Редирект < 20ms, потоковая аналитика в ClickHouse.

Редирект < 20msАналитика < 2 сек25+ измерений на переход

Бизнес-задача

Сервис сокращения ссылок с детальной аналитикой переходов. Исходная система на NodeJS + MongoDB не справлялась: медленная аналитика, негибкие лимиты, сложности с масштабированием.

Ключевая задача

Редирект должен быть мгновенным, но при этом нужно записать ~20 параметров аналитики. Синхронная запись в БД убивает время отклика. Решение: разделение путей чтения и записи. Редирект из in-memory кэша за < 20ms. Событие аналитики уходит в RabbitMQ без ожидания ответа.

Архитектура

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Nginx     │────▶│ link-server │────▶│  Memcached  │
└─────────────┘     └──────┬──────┘     └─────────────┘
                           │ async
              ┌────────────┼────────────┐
              ▼            ▼            ▼
        ┌──────────┐ ┌──────────┐ ┌──────────┐
        │ RabbitMQ │ │  Redis   │ │ backend  │
        │  (hits)  │ │(sessions)│ │  (API)   │
        └────┬─────┘ └──────────┘ └──────────┘
             │
        ┌────▼─────┐
        │ClickHouse│
        └──────────┘

Специализация кэшей

Memcached — горячие ссылки. Многопоточное чтение без состояния. Redis — сессии, JWT-токены, счётчики ограничения частоты. С состоянием, персистентность между рестартами.

ClickHouse: потоковая аналитика

RabbitMQ Table Engine для потоковой вставки без промежуточных преобразований. Данные доступны для отчётов с задержкой < 2 сек. 25+ измерений на каждый переход.

Защита от ботов

Анализ трафика на лету: GeoIP + разбор UserAgent. Блокировка бот-сетей до попадания в аналитику. Стоп-лист с комплексной логикой: IP-диапазоны (CIDR), регулярные выражения по URL.

Технологии

Backend

Java 11Spring BootSpring Data JPASpring SecuritygRPC

Data

PostgreSQLClickHouseRedisMemcachedRabbitMQ

Infra

DockerNginxGitLab CI/CDMaxMind GeoIP2

Наша роль

  • Спроектировали асинхронный конвейер RabbitMQ → ClickHouse
  • Реализовали гибридную схему кэширования (Memcached + Redis)
  • Внедрили gRPC для межсервисного взаимодействия
1 слот свободен
Написать