Pular para conteúdo

Aula 18 - Comunicação em Tempo Real com WebSockets ⚡

Objetivo Pedagógico

Objetivo: Arquitetura de comunicação bidirecional em tempo real de baixa latência, salas virtuais (rooms), namespaces e escalabilidade horizontal com Redis Adapter.


📑 1. Fundamentos Teóricos & Análise Técnica

O protocolo HTTP clássico opera no modelo Request-Response: o cliente solicita, o servidor responde e a conexão é encerrada. Para aplicações que exigem comunicação instantânea (chats corporativos, plataformas de trading, dashboards de telemetria e jogos multiplayer), técnicas antigas como Polling geram tráfego desnecessário e latência inaceitável.

O protocolo WebSocket (RFC 6455) estabelece uma conexão full-duplex persistente sobre uma única conexão TCP, iniciada a partir de um HTTP Upgrade Handshake.

Com a biblioteca Socket.IO: 1. Heartbeats e Auto-Reconexão: Detecção automática de quedas de rede e reconexão silenciosa com recuperação de mensagens perdidas. 2. Salas e Namespaces: Segmentação de conexões em grupos temáticos (socket.join('room-123')), permitindo enviar mensagens (broadcast) apenas para interessados. 3. Escalabilidade Horizontal com Redis Adapter: Quando o backend escala para múltiplos nós e instâncias, o Redis Pub/Sub sincroniza mensagens entre servidores diferentes, garantindo que usuários conectados em nós distintos troquem mensagens normalmente.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    subgraph MultiNodeCluster ["Cluster Node.js Escalado"]
        Node1["Servidor Node A (Socket.IO)"] <--> RedisPubSub["Redis Adapter (Pub/Sub)"]
        Node2["Servidor Node B (Socket.IO)"] <--> RedisPubSub
    end
    ClientA["Cliente A (Conectado no Nó A)"] <-->|WebSocket TCP| Node1
    ClientB["Cliente B (Conectado no Nó B)"] <-->|WebSocket TCP| Node2
    style MultiNodeCluster fill:#e3f2fd,stroke:#1565c0
    style RedisPubSub fill:#fff3e0,stroke:#e65100
    style ClientA fill:#e8f5e9,stroke:#2e7d32
    style ClientB fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Conexão Full-Duplex: Tanto o cliente quanto o servidor podem emitir eventos a qualquer instante sem requisição prévia. - Fallback Automático: Degradação suave para HTTP Long-Polling em redes corporativas restritas que bloqueiam WebSockets. - Multiplexação com Namespaces: Separação lógica de canais (ex: /notifications vs /chat) na mesma porta de rede. - Redis Pub/Sub para Clusters: Comunicação entre servidores para difusão de mensagens em ambientes com balanceador de carga.


🛠️ 2. Implementação Prática em Node.js WebSockets e Socket.IO

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// chat.gateway.ts (Gateway WebSocket com Salas em NestJS)
import { 
  WebSocketGateway, 
  SubscribeMessage, 
  MessageBody, 
  ConnectedSocket,
  WebSocketServer 
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

@WebSocketGateway({ cors: { origin: '*' } })
export class ChatGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('joinRoom')
  handleJoinRoom(@MessageBody() room: string, @ConnectedSocket() client: Socket) {
    client.join(room);
    client.emit('joined', `Conectado com sucesso à sala: ${room}`);
  }

  @SubscribeMessage('sendMessage')
  handleMessage(
    @MessageBody() payload: { room: string; text: string; sender: string }
  ) {
    // Emite mensagem exclusivamente para os membros da sala especificada
    this.server.to(payload.room).emit('newMessage', {
      sender: payload.sender,
      text: payload.text,
      timestamp: new Date().toISOString()
    });
  }
}

💡 Análise Passo a Passo do Código

  1. Decorador @WebSocketGateway: Inicializa o servidor Socket.IO integrado ao ciclo de vida da aplicação.
  2. Gestão de Salas: client.join(room) isola a transmissão de dados sem vazamento de privacidade para outros clientes.
  3. Broadcast Seletivo: this.server.to(payload.room).emit() transmite a mensagem exclusivamente para o público-alvo da conversa.

🎯 3. Próximos Passos & Sequência Didática