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 для межсервисного взаимодействия