Pular para conteúdo

Aula 17 - Integração Avançada Frontend/Backend com WebSockets ⚡

Objetivo Pedagógico

Objetivo: Conexão bidirecional resiliente de ponta a ponta entre SPA (Frontend) e API (Backend) com WebSockets, protocolo heartbeat e sincronização reativa de tela.


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

A integração em tempo real entre o frontend moderno e o backend distribuído requer sincronização de estado fluida e de baixa latência. No contexto de Aplicações Full Stack, estabelecer uma conexão WebSocket exige coordenar os dois lados da arquitetura: 1. No Backend (Servidor de Eventos): Autenticação da conexão no handshake inicial via token JWT, gerenciamento de conexões ativas em memória e difusão de eventos (broadcast) segmentada por permissões. 2. No Frontend (Cliente Reativo): Módulo de conexão resiliente que gerencia reconexão automática com recuo exponencial (exponential backoff), enfileira mensagens offline para reenvio e atualiza o estado da aplicação (como uma store Zustand ou Signal) imediatamente ao receber novas mensagens. 3. Mecanismo de Heartbeat (Ping/Pong): Detecção proativa de conexões mortas (zombie connections) causadas por perda de sinal de Wi-Fi ou suspensão de tela em dispositivos móveis.

📐 Arquitetura Conceitual & Diagrama de Fluxo

sequenceDiagram
    autonumber
    participant Frontend as SPA Frontend (React/Vue)
    participant WSGateway as WebSocket Gateway (Backend)
    participant StateStore as Client State Store (Zustand/Signals)

    Frontend->>WSGateway: 1. Handshake HTTP com Token JWT
    WSGateway-->>Frontend: 2. Upgrade para WebSocket Concluído (Conectado!)
    loop Sincronização e Heartbeat
        WSGateway->>Frontend: 3. Ping (A cada 25s)
        Frontend-->>WSGateway: 4. Pong
    end
    WSGateway->>Frontend: 5. Evento: "TASK_UPDATED" { id: 42, status: "DONE" }
    Frontend->>StateStore: 6. Atualização Reativa Cirúrgica do Estado
    StateStore-->>Frontend: 7. Interface Atualizada Instantaneamente!

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Autenticação no Handshake: Validação do token de segurança antes de aceitar a conexão persistente. - Reconexão com Backoff Exponencial: Prevenção de ataques de negação de serviço acidentais contra o próprio servidor após reinicializações. - Gerenciamento de Estado Reativo: A integração direta dos eventos de WebSocket com a store da SPA elimina telas desatualizadas. - Enfileiramento Offline: Mensagens disparadas pelo usuário durante quedas temporárias de rede são enviadas assim que a conexão volta.


🛠️ 2. Implementação Prática em Full Stack WebSockets e Eventos Reativos

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

// websocket-client.ts (Cliente WebSocket Resiliente para Frontend Full Stack)
export class ResilientWebSocketClient {
  private ws: WebSocket | null = null;
  private retryDelay = 1000;

  constructor(
    private readonly url: string,
    private readonly onMessageCallback: (data: any) => void
  ) {}

  connect() {
    this.ws = new WebSocket(this.url);

    this.ws.onopen = () => {
      console.log('[WebSocket] Conexão estabelecida com sucesso.');
      this.retryDelay = 1000; // Reseta delay após sucesso
    };

    this.ws.onmessage = (event) => {
      const data = JSON.parse(event.data);
      this.onMessageCallback(data);
    };

    this.ws.onclose = () => {
      console.warn(`[WebSocket] Conexão perdida. Tentando reconectar em ${this.retryDelay}ms...`);
      setTimeout(() => this.connect(), this.retryDelay);
      this.retryDelay = Math.min(this.retryDelay * 2, 30000); // Backoff até 30s
    };
  }

  send(payload: any) {
    if (this.ws && this.ws.readyState === WebSocket.OPEN) {
      this.ws.send(JSON.stringify(payload));
    }
  }
}

💡 Análise Passo a Passo do Código

  1. Backoff Exponencial: Math.min(this.retryDelay * 2, 30000) duplica o tempo de espera a cada falha de reconexão, estabilizando a rede.
  2. Tratamento de Desconexão: O evento onclose dispara nova tentativa de conexão de forma totalmente autônoma.
  3. Integração com Store: onMessageCallback recebe os dados parsed e despacha atualizações para a interface.

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