Sistema em Tempo Real
O CSGOFlip utiliza WebSocket para comunicação em tempo real, permitindo atualizações instantâneas de saldo, drops ao vivo, batalhas e notificações.
Arquitetura
Componentes
Socket.io com Redis Adapter
O Redis Adapter permite escalabilidade horizontal - múltiplas instâncias do backend podem compartilhar conexões WebSocket.
typescript
// redis-io.adapter.ts
import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Redis } from 'ioredis';
export class RedisIoAdapter extends IoAdapter {
private adapterConstructor: ReturnType<typeof createAdapter>;
async connectToRedis(): Promise<void> {
const pubClient = new Redis({
host: process.env.REDIS_HOST,
port: Number(process.env.REDIS_PORT),
});
const subClient = pubClient.duplicate();
this.adapterConstructor = createAdapter(pubClient, subClient);
}
createIOServer(port: number, options?: any): any {
const server = super.createIOServer(port, {
...options,
cors: {
origin: process.env.FRONTEND_URL,
credentials: true,
},
});
server.adapter(this.adapterConstructor);
return server;
}
}Seções
- WebSocket Gateway - Configuração e implementação do gateway
- Eventos - Todos os eventos disponíveis
- Live Drops - Sistema de drops em tempo real
Fluxo de Conexão
Tipos de Conexão
Conexão Autenticada
Usuários logados recebem eventos personalizados:
- Atualizações de saldo
- Notificações privadas
- Status de jogos em andamento
- Convites para batalhas
Conexão Pública
Visitantes não autenticados recebem apenas eventos públicos:
- Live drops
- Novas batalhas
- Resultados de sorteios
- Estatísticas gerais
Escalabilidade
Sticky Sessions: O load balancer usa sticky sessions para manter conexões WebSocket na mesma instância.
Configuração do Cliente
typescript
// Frontend - WebSocket Context
import { io, Socket } from 'socket.io-client';
const createSocket = (sessionId?: string): Socket => {
return io(process.env.NEXT_PUBLIC_WS_URL, {
auth: sessionId ? { sessionId } : undefined,
withCredentials: true,
transports: ['websocket', 'polling'],
reconnection: true,
reconnectionAttempts: 5,
reconnectionDelay: 1000,
reconnectionDelayMax: 5000,
});
};Métricas
O sistema coleta métricas de WebSocket via Prometheus:
| Métrica | Descrição |
|---|---|
ws_connections_total | Total de conexões ativas |
ws_connections_authenticated | Conexões autenticadas |
ws_events_sent_total | Eventos enviados |
ws_events_received_total | Eventos recebidos |
ws_rooms_count | Número de rooms ativos |
