Заказ закрыт
Стабилизация WEBSOCKET-подключений к биржам

Бюджет: по договоренности
ТЗ: Стабилизация WEBSOCKET-подключений к биржам
=================================================

github.com/arrrtem0607/ex...
github.com/arrrtem0607/ex...
github.com/arrrtem0607/ex...

КОНТЕКСТ

Система подключается к 6 биржам (Binance, Bybit, Bitget, Gate.io, KuCoin,
Hyperliquid) по WebSocket, получает orderbook и mark price в реальном времени.
Текущая реализация нестабильна – частые обрывы соединений, массовые потери
данных, высокие задержки.

Задача: сделать парсинг данных стабильным, без потерь и с минимальной задержкой.

---------------------------------------------------------------------------
ПРОБЛЕМА 1: Binance – частые обрывы WS-соединений
---------------------------------------------------------------------------

Binance-соединения регулярно обрываются (EOF, unexpected EOF,
connection reset by peer). Это единственная биржа с массовыми обрывами -
остальные работают значительно стабильнее.

Файлы:
  – internal/binance/ws.go (readLoop, handleConnection, buildURL, batchSymbols)
  – internal/binance/provider.go
  – config.json (секция binance)

---------------------------------------------------------------------------
ПРОБЛЕМА 2: KuCoin – обрывы Pro API соединений кластерами
---------------------------------------------------------------------------

KuCoin Pro API соединения обрываются группами – несколько соединений падают
одновременно, что приводит к одновременной потере данных по большому числу
символов.

Файлы:
  – internal/kucoin/ws.go (orderBookLoopPro, handleOrderBookConnectionPro,
    subscribePro, dialPro)

---------------------------------------------------------------------------
ПРОБЛЕМА 3: массовые stale drops на всех биржах
---------------------------------------------------------------------------

Сообщения с задержкой > 1 секунды отбрасываются (MaxStaleLatency). Объём
отбрасываемых данных огромен – миллионы OB и сотни тысяч MP сообщений в час.
Нужно устранить причину задержек, а не менять порог.

Файлы:
  – логика дропа в ws.go каждой биржи (поиск по obStaleCount, mpStaleCount)
  – порог задан в каждом provider.go (MaxStaleLatency: time.Second)

---------------------------------------------------------------------------
ПРОБЛЕМА 4: большинство тикеров постоянно в состоянии "устарели"
---------------------------------------------------------------------------

Тикер считается stale если для его биржи хотя бы одно соединение в состоянии
reconnecting (internal/store/store.go, метод ComputeStats). Из-за частых
обрывов Binance (проблема 1) все его символы почти постоянно stale – это 70%+
от общего числа тикеров.

Эта проблема является следствием проблем 1-3 и должна уйти при их решении.

---------------------------------------------------------------------------
ПРОБЛЕМА 5: P95/P99 latency упираются в потолок гистограммы
---------------------------------------------------------------------------

Перцентили latency у всех бирж показывают максимальное значение верхнего бакета
гистограммы (1000ms). Это значит, что значительная доля сообщений приходит
с задержкой >500ms.

Файлы:
  – internal/store/store.go (тип latencyHistogram, метод Percentile)

===========================================================================
КРИТЕРИИ ПРИЁМКИ
===========================================================================

Замер за 1 час непрерывной работы (go run .):

  Метрика                       Сейчас              Цель
  ----------------------------  ------------------  ----------------
  Binance WS обрывов/час        сотни               <>70%                 < 5%
  P95 latency                   1000ms (потолок)     < 500ms
  Все 6 бирж в "Соединения:"   5 из 6               6 из 6
  go test ./...                 pass                 pass

Статистика печатается в консоль каждые 5 секунд. Ключевые строки:

  Качество данных: OK                     <- цель
  Соединения: Binance 15/15 | ...        <- все active = total
  stale drops: 0 OB, 0 MP                <- цель
Опубликован 26.03.2026 в 18:50 Последнее изменение: 26.03.2026 в 18:50
Заказ находится в архиве

Выберите способ верификации:

Обновите страницу после прохождения верификации.