Разработка REST и WebSocket API для крипто-данных

Когда число обращений к биржевым данным растёт, устаревший слой доступа начинает терять запросы и тормозить витрины. Мы проектируем и настраиваем REST API для крипто-данных под ключ: перестраиваем схему, добавляем потоковые подписки и снимаем пиковую нагрузку. Обращения обслуживаются без отказов, а команда заказчика получает понятные конфигурации и регламенты.
Часто задаваемые вопросы

Почему REST API для крипто-данных не держит рыночную нагрузку

Слой доступа к рыночным данным проектируют первым, а ломается он первым. REST API для крипто-данных работает по схеме «запрос — ответ»: приложение идёт к источнику за каждой котировкой и ждёт ответа. Пока рынок спокоен, схема выглядит рабочей — задержки предсказуемы, число обращений растёт линейно вместе с числом пользователей.

На пиковой волатильности картина меняется скачком. Лимиты запросов к источнику выбираются за секунды, часть обращений получает отказ, а таймауты на пиковой волатильности становятся нормой, а не редким исключением. Клиент уходит в повторные попытки, добавляет нагрузку на слой доступа и замыкает круг: чем больше повторов, тем меньше успешных ответов доходит до продукта.

Дальше появляются устаревшие котировки в ответе. Если слой доступа отдаёт значение из кэша, не помечая его возраст, приложение показывает цену, которой на рынке уже нет, — и для торговли или расчётов это хуже честной ошибки. Добавляется рассинхрон: часть инструментов приходит одним каналом, часть другим, свежесть у них разная, и свести всё в один снимок рынка становится отдельной задачей.

В итоге нагрузка на слой доступа растёт не от числа пользователей, а от самой архитектуры обращения к источнику: добавление серверов проблему не снимает, потому что упор идёт во внешние ограничения источника. Разбираем, как это закрывается.

Что меняется после перестройки слоя доступа к блокчейн-данным

Скорость ответа и стабильность под пиковой нагрузкой

Перестройка слоя доступа начинается с разделения потоков: рыночные данные — цены, стаканы, сделки — читаются из кеша поверх Redis с коротким сроком жизни, а запросы к сети блокчейна идут через очередь с ограничением одновременных обращений к узлу. Кеширование рыночных данных снимает основную часть повторов, поэтому всплеск в часы высокой волатильности не превращается в очередь ожидающих клиентов. На наших замерах в действующих контурах время ответа на частые запросы сократилось кратно, а доля ошибок под пиковой нагрузкой держится в пределах десятых долей процента.

Отдельно закрыт класс отказов из-за недоступности внешнего источника: при сбое провайдера запрос обслуживается из последнего достоверного среза, подписки переподключаются сами. Восстановление после сбоя источника занимает минуты вместо часов простоя.

Сколько ручной работы уходит из процессов

Раньше устойчивость слоя доступа держалась на человеке: он следил за отставанием узлов, перезапускал потоки данных, вручную сверял расхождения между источником и своей базой. Теперь эти операции описаны правилами — контроль отставания, повторные попытки с затуханием, автоматическая сверка расхождений и оповещение только по аномалиям.

Сокращение ручных операций видно по дежурствам: часы рутинных проверок в неделю уходят. Схема доступа, правила кеширования и регламент восстановления остаются в документации, поэтому результат не привязан к конкретному инженеру.

Режимы доставки данных: опрос по запросу, потоковые подписки, гибрид

Формат доставки выбирают по тому, как часто меняются данные и сколько клиентов читают их одновременно. Для истории сделок, агрегатов за период и отчётов опрос по запросу даёт предсказуемую нагрузку: клиент сам задаёт окно и частоту, а сбой одного вызова не влияет на остальные. Для котировок, стакана и статусов транзакций нужны потоковые подписки — сервер отдаёт изменение сразу, без периода ожидания.

Вариант Когда подходит Ограничения
Опрос по запросу история, отчёты, редкие обновления задержка равна периоду опроса; при частом опросе растёт число лишних вызовов
Потоковые подписки котировки, стакан, статусы транзакций ограничение на число соединений; при обрыве нужны переподписка и досбор пропущенного
Гибридная схема доставки торговый интерфейс и аналитика в одном продукте сложнее в настройке и проверке, требуется единый контракт ключей между потоком и запросом

Когда опрос по запросу дешевле в поддержке

Опрос по запросу выигрывает там, где данные меняются реже, чем раз в несколько секунд: нет долгоживущего состояния соединения, нет переподписки после обрыва, а отладка идёт по обычным журналам вызовов. Ответы кэшируются на стороне сервиса, поэтому пик запросов от нескольких клиентов не превращается в пик обращений к источнику. Сравнение режимов получения данных здесь однозначно в пользу простоты сопровождения.

Гибридная схема: горячие данные в потоке, история по запросу

Гибридная схема доставки снимает главное ограничение подписок: в потоке остаётся только то, что меняется сейчас, а глубина и история уходят в запросы с постраничной выдачей. Клиент дособирает пропущенный отрезок после переподключения одним вызовом, а не перечитывает весь канал. Так интерфейс остаётся отзывчивым, а нагрузка на хранилище — предсказуемой.

Порядок работ: аудит запросов, схема, настройка, проверка, передача

Идём по этапам так, чтобы каждый следующий шаг опирался на зафиксированные данные предыдущего, а не на предположения. Сначала разбираем фактические обращения к источникам, затем проектируем схему, и только потом настраиваем лимиты и очереди — иначе параметры подбираются наугад и не выдерживают первой же пиковой нагрузки.

  1. Аудит обращений: снимаем лог запросов к источникам за рабочий период — кто, что и как часто запрашивает, где дубли и холостые вызовы.
  2. Схема интеграции источников: для каждого типа данных определяем основной и резервный источник, формат нормализации и приоритет при расхождении значений.
  3. Настройка лимитов и очередей: распределяем квоты по потребителям, ставим буферизацию всплесков и правило деградации, когда источник отвечает медленно или отдаёт ошибки.
  4. Нагрузочная проверка: прогоняем профиль, близкий к пиковому, замеряем задержку ответа и долю отказов, проверяем, что очереди разгружаются без роста задержки.
  5. Передача контура: отдаём конфигурации, доступы, схему и регламент реагирования на сбои, разбираем с вашей командой типовые инциденты.

Что проверяем на этапе аудита

Здесь важны замеры, а не общие слова: фиксируем частоту и профиль запросов по каждому источнику, его лимиты и фактическую задержку ответа, отмечаем точки отказа — источник без резерва, жёсткий лимит без запаса, отсутствие повторов при обрыве связи. По этим данным считаем запас по квотам и решаем, где нужна буферизация, а где достаточно локального кеша.

Что остаётся у команды заказчика: конфигурации, схемы, регламенты

На руки передаётся не набор доступов и устных договорённостей, а комплект артефактов, по которому ваша команда может сама поднять сервис, подключить новый источник и разобрать расхождение в данных без нашей помощи.

Состав передаваемой документации

  • Конфигурации сервисов: параметры окружений, лимиты запросов, правила переподключения подписок и таймауты.
  • Схемы потоков данных: путь от источника через нормализацию и кеш до точки выдачи, с указанием мест возможных потерь и дублей.
  • Матрица доступа: какие сервисы и роли к каким методам, ключам и потокам имеют право, с разделением чтения и администрирования.
  • Документация по интерфейсам: описание методов REST и каналов WebSocket, форматы ошибок, лимиты, примеры запросов и ответов.
  • Модель данных: единый формат инструмента, пары, сделки и свечи, правила сведения данных из нескольких источников.
  • Описание тестового контура: как поднять стенд и воспроизвести инцидент на исторических данных.

Регламенты и зоны ответственности

Отдельно передаётся регламент обновления источников: порядок добавления нового источника, проверка совместимости формата на тестовом контуре и условия включения в рабочий контур. Там же фиксируем границу ответственности: что мониторит наша дежурная смена в период сопровождения, а что переходит к вашей, как оформляются изменения схемы ответа и куда смотреть при расхождении котировок между источниками.

Пример внедрения: биржевой агрегатор — рост обращений без отказов

Клиент — биржевой агрегатор, который сводит котировки и стакан с десятков площадок и отдаёт их внешним приложениям через публичный REST API и поток WebSocket. К росту аудитории система оказалась не готова: её пробовали расширять, дописывая новые методы API поверх общего монолита, и это лишь усиливало проблему.

Что было до перестройки

Один сервис совмещал сбор рыночных данных, расчёты и отдачу клиентам, поэтому пиковый трафик бил по всем узлам сразу. Доля отказов держалась на уровне 9-14% в часы высокой активности, время отклика на тяжёлых выборках доходило до нескольких секунд, а лимиты и кэш операторы правили вручную — до двадцати вмешательств в неделю. Разбор инцидента занимал часы: не было видно, на каком участке потерялись данные.

Результат в измеримых показателях

Сбор и расчёты вынесли в отдельный контур, отдачу клиентам — в свой, с независимым масштабированием и кэшем горячих подписок. Доля отказов на пике — 0,2–0,4%, время отклика под нагрузкой — десятые доли секунды при выросшей втрое пиковой нагрузке, ручных правок — не больше одной-двух в месяц. Метрики сняты с эксплуатационных панелей в Grafana, они остались у заказчика вместе с настройками оповещений.

При деградации отдельной площадки подписка не рвётся: клиент получает данные из резервного канала, а событие уходит в лог для разбора. Этот запас прочности и позволил наращивать аудиторию без пересмотра архитектуры.

Что делать, если собственный узел и API уже развёрнуты

Развёрнутый собственный узел и работающий API — не повод переписывать контур целиком. Сначала снимаем инвентаризацию: какие методы отдают трафик, кто из потребителей на них завязан, где запросы идут напрямую в узел и на каком объёме он начинает отставать от сети. Это даёт карту решений — что остаётся как есть, а что уходит под новый слой.

Ключевое изменение — кеш и очередь между потребителями и узлом. Горячие данные вроде балансов и последних блоков отдаются из кеша с настраиваемым сроком жизни, тяжёлые исторические выборки уходят в очередь и считаются фоном. Подписки на события обслуживает отдельный канал, поэтому всплеск активности не роняет основные запросы, а узел не дублирует одну и ту же работу сотни раз.

Миграция без простоя строится на постепенном переносе. Новый слой поднимается рядом со старым, доля трафика переводится на него, ответы сверяются с прежними на живых запросах. Совпадают — доля растёт; расходятся — переключение откатывается одной командой, и потребители разницы не замечают.

Текущие интеграции при этом сохраняются: адреса методов и формат ответов остаются прежними, меняется только внутренняя начинка. Поэтапное включение идёт по одному методу за раз, так что продукт не остаётся без данных ни на минуту, а каждая переключённая часть сразу видна в метриках.

Технические сомнения: нагрузка, сбои источника, поддержка

Перед стартом инженеры заказчика задают один и тот же набор вопросов: как контур ведёт себя при падении источника, как убедиться, что данные не потерялись в пути, сколько занимает подключение и что будет после запуска. Ниже — ответы в том виде, в каком мы их даём на технических сессиях, с опорой на эксплуатацию похожих контуров: сервис не доверяет источнику и проверяет себя сам.

Что произойдёт, если источник перестанет отдавать данные?

Сбой источника не роняет контур: запросы уходят в очередь с повторными попытками и растущей задержкой, а потребители получают последние достоверные значения с отметкой времени. После восстановления связи расхождения досчитываются по журналу, а не затираются новым потоком.

Как проверяете полноту данных?

Непрерывность последовательности событий, сверка агрегатов с независимым источником (например, CoinGecko) и доля пропущенных интервалов. Если разрыв выше порога, окно помечается недостоверным и не уходит потребителю молча.

Сколько занимает ввод в работу и что с поддержкой?

Первый контур на одном источнике — дни: адаптер, схема данных, проверки, прогон на записанном трафике. Дальше — дежурство по метрикам задержки и доли ошибок, обновление адаптеров при изменении формата ответов, плановые проверки восстановления из журнала.

Как добавить или заменить источник позже?

Адаптер отделён от ядра: новый поставщик подключается со своим приоритетом и правилами сверки. Замена идёт канареечно — часть трафика на новом источнике, сравнение метрик, затем переключение основного.

Старт работ: что нужно с вашей стороны и как мы вернёмся с оценкой

Чтобы вернуться с оценкой и планом работ, а не с общими предположениями, нам нужен минимум вводных. Часть из них про сами данные, часть — про доступы и ограничения на вашей стороне.

  • Перечень источников: биржи, брокерские системы или собственные сервисы, откуда берём котировки, стакан, сделки и историю.
  • Где достаточно периодических запросов, а где нужен постоянный поток WebSocket с переподключением и добором пропущенного.
  • Ключи к источникам в режиме только чтения, без прав на торговые операции.
  • Доступ к среде развёртывания или репозиторию и понимание, куда писать логи и метрики.
  • Лимиты поставщика данных: частота обращений, глубина истории, поведение при превышении.
  • Требования к разграничению доступа и журналированию обращений.
  • Контакт с вашей стороны, кто оперативно подтвердит формат полей и ответит на уточнения.

Порядок старта такой: обсуждаем задачу, фиксируем объём источников и сценарии потребления, после чего возвращаемся с оценкой и планом работ — этапами, сроками и точками приёмки. Первый этап работ снимает главный риск и обычно идёт быстрее остальных: описываем эндпоинты и формат потока, поднимаем каркас REST API для крипто-данных на одном источнике, проверяем поведение при обрыве связи, повторе запроса и расхождении данных между источниками. Дальше подключаем остальные источники по уже отработанной схеме.

Опишите задачу — какие данные нужны и кто их будет потреблять; остальное уточним в разговоре.

Направления блокчейн-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139