Skip to content

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

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étricaDescrição
ws_connections_totalTotal de conexões ativas
ws_connections_authenticatedConexões autenticadas
ws_events_sent_totalEventos enviados
ws_events_received_totalEventos recebidos
ws_rooms_countNúmero de rooms ativos

Documentação Técnica CSGOFlip