Розробка API для доступу до зібраних даних
Ми розробляємо REST та WebSocket API для доступу до зібраних крипто-даних. Історичні транзакції, funding rates, gas prices — усе це має бути доступне з мінімальною затримкою та стабільною продуктивністю. Наш досвід у блокчейн-розробці дозволяє створювати API, які витримують навантаження понад 2000 запитів на секунду та не розкривають зайвого.
Які проблеми вирішує правильно спроектоване API?
Сирі дані з бірж та блокчейнів — це хаос. Без продуманого API ви зіткнетеся з трьома типовими проблемами: нестабільна пагінація при додаванні нових записів, висока затримка при time-series запитах та відсутність контролю доступу. Ми вирішуємо їх через cursor-пагінацію (стабільніша за offset у 100% випадків), багаторівневе кешування та API-ключі з rate limiting.
Архітектура API
Використовуємо Fastify (Node.js) для REST та WebSocket, Redis для кешу та rate limiting, PostgreSQL або ClickHouse для зберігання даних. Стандартні практики: версіонування через URL (/v1/), ISO 8601 для часу, поле ?fields= для вибору колонок.
REST ендпоінти проектуємо під конкретні сценарії: funding rates, транзакції, новини. Кожен ендпоінт підтримує cursor-пагінацію, яка стабільна під час вставки нових даних — на відміну від offset-пагінації.
Приклад валідації за допомогою Zod:
Приклад валідації Zod
import { z } from "zod"; const FundingRatesQuerySchema = z.object({ symbol: z.string().regex(/^[A-Z]+-[A-Z]+$/, "Invalid symbol format"), exchange: z.enum(["binance", "bybit", "okx", "hyperliquid"]).optional(), from: z.coerce.date(), to: z.coerce.date(), limit: z.coerce.number().min(1).max(1000).default(100), cursor: z.string().optional(), }); Раннє повернення 400 з детальними помилками економить час клієнтів.
| Ендпоінт | Опис | Метод |
|---|---|---|
/v1/funding-rates |
Історичні ставки фінансування | GET |
/v1/transactions/{chain}/{address} |
Історичні транзакції за адресою | GET |
/v1/news |
Новинарна стрічка за тегами | GET |
/v1/gas/history |
Історія газових цін | GET |
/v1/stream |
Real-time потік даних | WebSocket |
Багаторівневе кешування критичне для крипто-даних
Крипто-дані поділяються на історичні (незмінні) та real-time. Історичні можна кешувати надовго, real-time — лише на секунди. Ми використовуємо три рівні:
| Рівень | Що кешує | TTL |
|---|---|---|
| CDN | Статичні історичні дані | 1 година |
| Redis | Результати частих запитів | 30 с – 5 хв |
| База даних (read replica) | Все інше | — |
Redis-кеш будується за ключем запиту. Приклад:
async function getFundingRates(query: FundingRatesQuery): Promise<FundingRateRecord[]> { const cacheKey = `fr:${query.symbol}:${query.exchange ?? "all"}:${query.from.getTime()}:${query.to.getTime()}`; const cached = await redis.get(cacheKey); if (cached) return JSON.parse(cached); const data = await db.queryFundingRates(query); const ttl = query.to < new Date(Date.now() - 3600_000) ? 3600 : 30; await redis.setEx(cacheKey, ttl, JSON.stringify(data)); return data; } Для time-series запитів у PostgreSQL використовуємо покриваючі індекси:
CREATE INDEX CONCURRENTLY idx_funding_rates_lookup ON funding_rates (symbol, exchange, settled_at DESC) INCLUDE (funding_rate, mark_price); Для аналітики (агрегації, середні) ClickHouse швидший за PostgreSQL у 5–10 разів. Redis кеш знижує затримку до 50 разів у порівнянні з прямими запитам до БД.
Реалізація real-time потоку
WebSocket-сервер на Fastify підписує клієнтів на канали подій. Heartbeat кожні 30 секунд відсікає завислі з'єднання.
fastify.get("/v1/stream", { websocket: true }, (socket, req) => { const subscriptions = parseSubscriptions(req.query); const unsubscribers = subscriptions.map((sub) => eventBus.on(sub.channel, (data) => { if (socket.readyState === WebSocket.OPEN) { socket.send(JSON.stringify({ channel: sub.channel, data })); } }) ); socket.on("message", (msg) => { const cmd = JSON.parse(msg.toString()); if (cmd.type === "subscribe") { /* ... */ } if (cmd.type === "unsubscribe") { /* ... */ } if (cmd.type === "ping") socket.send(JSON.stringify({ type: "pong" })); }); socket.on("close", () => unsubscribers.forEach(unsub => unsub())); }); Безпека та контроль доступу
Використовуємо API-ключі замість JWT — вони простіші в управлінні. Rate limiting на основі sliding window з Lua-скриптом у Redis:
local key = KEYS[1] local limit = tonumber(ARGV[1]) local window = tonumber(ARGV[2]) local now = tonumber(ARGV[3]) redis.call("ZREMRANGEBYSCORE", key, 0, now - window) local count = redis.call("ZCARD", key) if count >= limit then return 0 end redis.call("ZADD", key, now, now) redis.call("EXPIRE", key, window / 1000) return 1 У відповідях клієнт бачить заголовки X-RateLimit-* — може адаптувати свою поведінку.
Моніторинг та observability
Для production API необхідний збір метрик у реальному часі. Ми підключаємо Prometheus з набором стандартних лічильників: кількість запитів за методом та маршрутом, P50/P95/P99 latency, відсоток помилок (4xx та 5xx), поточна кількість WebSocket-з'єднань. Grafana-дашборд показує навантаження у розрізі ендпоінтів — одразу видно, який запит почав гальмувати.
Алертинг налаштовуємо через Alertmanager: P99 latency вище 500 мс, error rate вище 1%, Redis недоступний, черга WebSocket-подій зростає. Така система дозволяє виявляти вузькі місця до того, як клієнти помічають деградацію. Середній час реакції на інцидент при налаштованому моніторингу — до 2 хвилин. Ми гарантуємо 99.9% аптайм для production-контурів.
Структуроване логування (JSON) через pino дає можливість агрегувати помилки за типом запиту та API-ключем. Це критично при налагодженні: видно, хто і що запитує, де пагінація ламається, чому клієнт отримує 400 замість 200. Логи відправляються в Loki або Elasticsearch — залежно від інфраструктури. Retention політика: детальні логи 7 днів, агреговані метрики — 90 днів.
Склад розробки API під ключ
- Проектування схеми ендпоінтів та пагінації
- Реалізація REST + WebSocket на Fastify
- Інтеграція з Redis та ClickHouse/PostgreSQL
- Аутентифікація через API-ключі та rate limiting
- Написання OpenAPI документації
- Моніторинг з Prometheus та Grafana (P99 latency, request rate)
Термін розробки — 4–7 тижнів залежно від кількості джерел даних та вимог до продуктивності. Вартість розробки базового API становить від $8,000, комплексні рішення — до $25,000. Ми маємо 5+ років досвіду в блокчейн-розробці та виконали понад 30 проектів у сфері API. На всі роботи надається гарантія якості.
За даними CoinGecko, обсяг ринку крипто-даних зростає на 40% щорічно. Пишіть — оцінимо ваш проект та запропонуємо конкретну архітектуру.







