Стабилизация WEBSOCKET-подключений к биржам (для всех)

⚓ Work    📅 2026-03-26    👤 surdeus    👁️ 1      

surdeus

ТЗ: Стабилизация 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 <- цель 🏷️ Work_feed