Arbitragem em Tempo Real via WebSocket
O fluxo WebSocket é completamente independente do fluxo REST existente. Ambos rodam em paralelo — o WebSocket adiciona latência ultrabaixa sem afetar a estabilidade do processamento REST de 19 segundos.
🎯 Visão Geral
O sistema possui dois fluxos de integração complementares:| Característica | Fluxo REST (existente) | Fluxo WebSocket (novo) |
|---|---|---|
| Frequência | A cada 19 segundos | Contínuo (event-driven) |
| Latência | ~10–19 s | < 200 ms |
| Exchanges | 17 (polling) | 12 (fase 1–3) + 5 (REST-only) |
| Entrega ao frontend | HTTP polling | Server-Sent Events (SSE) |
| Persistência | MongoDB (operacoes) | MongoDB (operations_realtime) |
| Ativação | Sempre ativo | ENABLED_WEBSOCKET=1 |
🏗️ Arquitetura dos Componentes
Componentes Principais
WebSocketExchangeHandler
Interface contratual para cada exchange. Implementa
Connect(), Name() e HealthCheck(). Cada exchange tem sua própria implementação.RealtimePriceCache
Cache thread-safe em memória. Preserva volume REST quando o tick WebSocket não o fornece. Fornece
GetAll() no mesmo formato do fluxo REST.RealtimeArbitrageEngine
Motor de detecção. Debounce de 200ms por símbolo evita processamento excessivo. Reutiliza
CompareBaseQuotePrices() do fluxo REST sem duplicação de código.SSEBroadcaster
Fan-out de Server-Sent Events para todos os browsers conectados. Cada cliente recebe um canal dedicado com backpressure automático.
WebSocketManager
Singleton orquestrador. Gerencia reconexão automática com backoff exponencial (1s → 2s → 4s → 8s → 16s máx).
🔄 Fluxo de Dados Detalhado
1. Conexão e Seed de Volume
Ao conectar, o handler WebSocket da Binance:- Chama a REST API pública para buscar snapshot de volume (24h) de todos os pares
- Alimenta o
RealtimePriceCachecom os dados iniciais - Abre conexão WebSocket:
wss://stream.binance.com:9443/ws - Subscreve o stream
!bookTicker(todos os pares, bid/ask em tempo real) - Inicia timer de 60s para refresh periódico do volume via REST
2. Processamento de Ticks
3. Reconexão Automática
⚡ Ativação
O fluxo WebSocket é controlado por variável de ambiente para garantir zero impacto em produção enquanto não estiver pronto:Se
ENABLED_WEBSOCKET não estiver definido ou for qualquer outro valor, o fluxo WebSocket não é iniciado e nenhum recurso adicional é consumido.📡 Endpoints SSE
Três endpoints HTTP expõem os dados do fluxo WebSocket:| Endpoint | Tipo | Descrição |
|---|---|---|
GET /v1/realtime/status | JSON | Status de cada handler WebSocket |
GET /v1/realtime/arbitrage | SSE stream | Oportunidades de arbitragem em tempo real |
GET /v1/realtime/prices | SSE stream | Snapshot completo de preços a cada 1s |
Consumo no Frontend (EventSource)
A API
EventSource do browser reconecta automaticamente ao servidor em caso de desconexão, sem necessidade de lógica adicional no frontend.🗄️ Persistência
Oportunidades detectadas pelo motor WebSocket são salvas na coleçãooperations_realtime do MongoDB:
A coleção
operations_realtime é projetada para ter TTL curto — os dados são efêmeros por natureza, servindo principalmente como auditoria e buffer para clientes que se reconectam.🔌 Exchanges Suportadas
Fase 1 — Concluída ✅
| Exchange | Stream | Status |
|---|---|---|
| Binance | wss://stream.binance.com:9443/ws — !bookTicker | ✅ Implementado |
Fase 2 — Planejada 🔄
| Exchange | Stream |
|---|---|
| OKX | wss://ws.okx.com:8443/ws/v5/public — tickers |
| Bybit | wss://stream.bybit.com/v5/public/spot — tickers |
| KuCoin | wss://ws-api.kucoin.com — market/ticker:all |
| Gate.io | wss://api.gateio.ws/ws/v4/ — spot.tickers |
| HTX | wss://api.huobi.pro/ws — market.$symbol.bbo |
Fase 3 — Planejada 🔄
| Exchange | Stream |
|---|---|
| Bitget | wss://ws.bitget.com/v2/ws/public — tickers |
| Kraken | wss://ws.kraken.com — ticker |
| Bitfinex | wss://api-pub.bitfinex.com/ws/2 — ticker |
| BingX | wss://open-api-ws.bingx.com/market — tickers |
| MEXC | wss://wbs.mexc.com/ws — spot@public.bookTicker.v3.api |
| Crypto.com | wss://stream.crypto.com/exchange/v1/market — ticker |
Fase 4 — REST-only (sem WebSocket público)
| Exchange | Motivo |
|---|---|
| Mercado Bitcoin | Sem WebSocket público documentado |
| Foxbit | API privada apenas |
| Novadax | REST polling suficiente |
| Bitso | WebSocket requer autenticação |
🧪 Interface do Handler
Para adicionar suporte a uma nova exchange, implemente a interfaceWebSocketExchangeHandler:
WebSocketManager:
📊 Monitoramento
Use o endpoint/v1/realtime/status para verificar a saúde de cada handler:
- ✅ Fase 1 concluída: Binance implementado e testado
- 🔄 Fase 2: Implementar OKX, Bybit, KuCoin, Gate.io, HTX
- 🔄 Fase 3: Bitget, Kraken, Bitfinex, BingX, MEXC, Crypto.com
- 🔄 Fase 4: Avaliar alternativas para exchanges REST-only