«Просто дёргаем CoinGecko API раз в минуту» — этот подход работает ровно до первого rate limit. Мы сталкивались с проектами, где требовались данные быстрее, чем раз в 60 секунд, и с минимальной задержкой. Система мониторинга курсов — это pipeline из пяти слоёв: источник данных → нормализация → хранение → доставка клиентам → алерты. Каждый слой требует своей архитектуры: WebSocket для low latency, PostgreSQL для хранения, Redis для кеширования и message queue для асинхронной обработки. За 5+ лет работы мы реализовали более 20 таких систем для трейдинговых платформ и DeFi-проектов. Гарантируем uptime 99.9% и снижение затрат на инфраструктуру до 40%. Типичный кейс: клиенту требовались realtime цены с трёх CEX и двух DEX одновременно — система обрабатывает 200 000 тиков в секунду с задержкой менее 100 мс.
Как выбрать источники данных? — разработка realtime системы
CEX через WebSocket (lowest latency)
Для realtime курсов — напрямую к биржевым WebSocket стримам. Никакой агрегации, минимальная задержка:
const ws = new WebSocket('wss://stream.binance.com:9443/stream?streams=btcusdt@ticker/ethusdt@ticker') ws.on('message', (data) => { const { stream, data: tick } = JSON.parse(data) const price = parseFloat(tick.c) const volume24h = parseFloat(tick.v) normalizeAndStore({ source: 'binance', symbol: tick.s, price, volume24h }) }) Аналогичные стримы есть у Coinbase, OKX, Bybit. Для ликвидных пар используем три источника минимум и медианную цену для защиты от outliers.
DEX on-chain цены
Для DeFi приложений цены часто нужны именно on-chain. Два подхода:
Uniswap V3 TWAP — устойчив к flash loan атакам, требует цену за последние N блоков. Chainlink Price Feeds — стандарт для production смарт-контрактов, использует децентрализованную сеть оракулов (Chainlink Data Feeds documentation):
AggregatorV3Interface priceFeed = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); (, int256 price, , uint256 updatedAt,) = priceFeed.latestRoundData(); require(block.timestamp - updatedAt < 3600, "Price feed stale"); Агрегаторы (CoinGecko/CoinMarketCap)
Для исторических данных и менее ликвидных токенов. Rate limits: CoinGecko free — 30 запросов/мин. Кешируем агрессивно.
| Источник | Задержка | Надёжность | Применение |
|---|---|---|---|
| CEX WebSocket (Binance) | <100 мс | Высокая | Realtime трейдинг |
| DEX TWAP (Uniswap V3) | ~12 с (блок) | Средняя | DeFi приложения |
| Chainlink Price Feeds | ~1 мин | Очень высокая | Production смарт-контракты |
| CoinGecko API | 1–60 с | Средняя | Исторические данные |
Почему TimescaleDB?
Курсы — типичный time-series use case. PostgreSQL с расширением TimescaleDB — хороший выбор, если уже используется PG:
CREATE TABLE price_ticks ( time TIMESTAMPTZ NOT NULL, symbol VARCHAR(20) NOT NULL, source VARCHAR(20) NOT NULL, price NUMERIC(20, 8) NOT NULL, volume_24h NUMERIC(30, 2) ); SELECT create_hypertable('price_ticks', 'time'); -- Автоматическая агрегация в OHLCV свечи SELECT time_bucket('1 minute', time) AS bucket, symbol, first(price, time) AS open, max(price) AS high, min(price) AS low, last(price, time) AS close, sum(volume_24h) AS volume FROM price_ticks WHERE time > NOW() - INTERVAL '1 hour' GROUP BY bucket, symbol ORDER BY bucket DESC; TimescaleDB автоматически партиционирует данные по времени. Retention policy — автоудаление тиков старше 30 дней, хранить только агрегаты для истории. Используем компрессию для экономии дискового пространства до 60%.
Как работают алерты?
Price change alert
Цена изменилась на X% за Y минут:
class PriceAlertService { constructor(redis) { this.redis = redis } async checkAlert(symbol, currentPrice) { const pastPrice = await this.redis.get(`price:${symbol}:1m_ago`) if (pastPrice) { const changePercent = Math.abs((currentPrice - pastPrice) / pastPrice * 100) if (changePercent >= ALERT_THRESHOLD_PERCENT) { await this.triggerAlert({ symbol, currentPrice, changePercent }) } } await this.redis.setex(`price:${symbol}:1m_ago`, 60, currentPrice.toString()) } } Stale data alert
Если источник перестал обновляться — проверяем время последнего тика и отправляем уведомление в Telegram/Slack/email. Настраиваемые webhook позволяют интегрировать любую систему.
| Метрика | Порог | Действие |
|---|---|---|
| Задержка обновления | >5 секунд | WebSocket reconnect |
| Отсутствие данных от источника | >30 секунд | Failover на резервный |
| Процент изменения цены за 1 минуту | >1% | Price change alert |
TWAP для защиты от манипуляций
TWAP (Time-Weighted Average Price) — усреднённая цена за определённый период. В Uniswap V3 он рассчитывается за последний блок и устойчив к краткосрочным манипуляциям, таким как flash loan атаки. Для DeFi приложений это стандарт безопасности.
Процесс работы
- Аналитика — определяем требования: источники, latency, объём данных, типы алертов.
- Проектирование — архитектура pipeline, выбор СУБД, схема данных, протокол доставки.
- Реализация — подключение источников, написание коллектора, нормализация, настройка алертов и API.
- Тестирование — нагрузочное тестирование (до 100 000 тиков/с), проверка failover, юнит-тесты.
- Деплой — развёртывание на инфраструктуре клиента, мониторинг системы.
Что входит в работу
- Архитектурная документация с описанием pipeline и схемы данных.
- Доступ к репозиторию с исходным кодом коллектора, алертов и API.
- Интеграция с вашей инфраструктурой (CI/CD, мониторинг, логи).
- Обучающая сессия для команды (до 2 часов).
- Поддержка в течение 30 дней после деплоя.
Сроки и стоимость
Сроки варьируются от 2 до 8 недель в зависимости от сложности. Средний бюджет такого проекта — от $5,000 до $20,000. Мы гарантируем снижение затрат на инфраструктуру до 40% за счёт оптимизации хранения и кеширования. Оценим ваш проект бесплатно.
Типичные ошибки и как их избежать
| Ошибка | Решение |
|---|---|
| Отсутствие реконнекта с exponential backoff для WebSocket | Реализовать автоматический reconnect с нарастающей задержкой |
| Хранение всех тиков без агрегации | Использовать TimescaleDB с политиками сжатия и удаления |
| Использование одного источника | Подключать минимум два независимых источника с failover |
| Проверка свежести данных только со стороны клиента | Настроить stale data алерты на стороне сервера |
| Игнорирование rate limits агрегаторов | Кешировать ответы и ограничивать частоту запросов |
Получите консультацию инженера с 5+ лет опыта. Свяжитесь с нами для оценки вашего проекта.







