«Просто дьоргаємо 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 тижнів залежно від складності. Ми гарантуємо зниження витрат на інфраструктуру до 40% за рахунок оптимізації зберігання та кешування. Оцінимо ваш проєкт безкоштовно.
Типові помилки та як їх уникнути
| Помилка | Рішення |
|---|---|
| Відсутність реконнекту з exponential backoff для WebSocket | Реалізувати автоматичний reconnect з наростаючою затримкою |
| Зберігання всіх тиків без агрегації | Використовувати TimescaleDB з політиками стиснення та видалення |
| Використання одного джерела | Підключати мінімум два незалежних джерела з failover |
| Перевірка свіжості даних лише з боку клієнта | Налаштувати stale data алерти на стороні сервера |
| Ігнорування rate limits агрегаторів | Кешувати відповіді та обмежувати частоту запитів |
Отримайте консультацію інженера з 5+ років досвіду. Зв'яжіться з нами для оцінки вашого проєкту.







