ТЗ: Стабилизация WEBSOCKET-подключений к биржам
=================================================
https://github.com/arrrtem0607/exchange-data-collector
https://github.com/arrrtem0607/exchange-data-collector
https://github.com/arrrtem0607/exchange-data-collector
КОНТЕКСТ
Система подключается к 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 <- цель