О проекте
Клиент — стартап, создающий инструменты аналитики для криптотрейдеров. Продукт: веб-платформа с агрегированными рыночными данными, настраиваемыми дашбордами и системой алертов.
Основной технический вызов: платформа должна показывать данные в реальном времени сотням пользователей одновременно, не создавая сотни отдельных подключений к биржам.
Технические требования
- Real-time дашборды с обновлением данных < 500 мс
- Поддержка 300+ одновременных пользователей при старте, масштабируемость до 2000+
- Кастомизируемые виджеты: графики, ордербуки, потоки сделок, индикаторы
- Система алертов: цена выше X, объём больше Y — уведомление
- История данных за последние 2 года
- Аутентификация, подписки, биллинг
Архитектура
Ключевое решение: разделение слоя сбора данных и слоя доставки пользователям.
Data ingestion layer (Go): один модуль подключается к биржам. Один WebSocket на биржу — а не по одному на каждого пользователя. Собранные данные публикуются в Kafka.
Stream processing (Go + Apache Kafka): Kafka агрегирует потоки от всех бирж, обеспечивает надёжную доставку и буферизацию.
Delivery layer (Node.js + WebSocket): получает обработанные данные из Kafka и рассылает подписанным пользователям. Каждый пользователь подписывается только на видимые виджеты.
Frontend (Next.js + React): SSR для быстрой загрузки, WebSocket для real-time, Recharts для графиков.
База данных: PostgreSQL + TimescaleDB для временных рядов. Запросы к истории за год — секунды.
Инфраструктура: Kubernetes на AWS. Auto-scaling delivery layer при росте нагрузки.
Решение проблемы масштабирования
Реализовали систему subscription management: delivery layer знает, кто смотрит на что. При получении события из Kafka — рассылаем только подписанным на этот символ. Пользователь на вкладке с ETH не получает трафик BTC.
Алерт-система
Движок правил обрабатывает пользовательские условия против потока данных. Правила компилируются в оптимизированные предикаты и группируются по символу для batch-проверки. При срабатывании — уведомление в браузере, Email, Telegram.
Результат
- Задержка доставки: медиана 180 мс, 95-й перцентиль 420 мс
- Нагрузочное тестирование: 500 одновременных пользователей без деградации
- 18 месяцев тиков по 200 парам — 2,3 ТБ, нормальная скорость запросов
- Время срабатывания алертов: < 1 секунды