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