Willian Website

Desenvolvimento de aplicações web em tempo real com websockets e server-sent events para experiências mais dinâmicas e escaláveis

Desenvolvimento de aplicações web em tempo real com websockets e server-sent events para experiências mais dinâmicas e escaláveis

Desenvolvimento de aplicações web em tempo real com websockets e server-sent events para experiências mais dinâmicas e escaláveis

Por que sua aplicação web precisa ser em tempo real (e o que isso significa na prática)

Hoje, se o seu app depende do usuário atualizar a página para ver algo novo, você já está ficando para trás. Chats, dashboards, notificações, sistemas de logística, plataformas de curso ao vivo, CRMs… tudo isso se beneficia de atualizações em tempo real.

Quando falo em “tempo real”, não é mágica. É basicamente: o servidor consegue enviar dados para o navegador assim que algo muda, sem o cliente ficar perguntando “e agora? já tem coisa nova?”. É aí que entram duas tecnologias que você precisa dominar:

WebSockets e Server-Sent Events (SSE).

Neste artigo, vou te mostrar:

WebSockets vs Server-Sent Events: o que muda de verdade

Vamos direto ao ponto. Os dois resolvem o mesmo tipo de problema: enviar atualizações do servidor para o cliente sem ficar fazendo polling (requisições repetidas a cada X segundos).

WebSockets

WebSocket é um protocolo que cria um canal de comunicação bidirecional entre cliente e servidor. Depois do handshake inicial (via HTTP), a conexão é “atualizada” para WebSocket e fica aberta.

O que isso significa?

Casos típicos:

Server-Sent Events (SSE)

Server-Sent Events usam um endpoint HTTP que mantém a conexão aberta e envia dados do servidor para o cliente em formato de stream. É uni-direcional: só o servidor envia eventos, o cliente apenas recebe.

No navegador, você usa a interface EventSource.

Características:

Casos típicos:

Resumo prático:

Por que não usar só polling e pronto?

Polling (fazer requisições a cada X segundos) parece simples, mas escala mal.

Imagine:

Isso dá 2.000 requisições por segundo só para saber se “tem algo novo”. Em muitos cenários, 99% das respostas serão “nada mudou”. Você gasta banda, CPU e ainda gera latência desnecessária.

WebSockets e SSE evitam esse desperdício: a conexão fica aberta, o servidor só envia quando tem dado relevante.

Comparando WebSockets e SSE ponto a ponto

Para te ajudar a decidir, vamos olhar alguns critérios práticos.

1. Direção da comunicação

2. Suporte de navegador

3. Simplicidade de implementação

4. Escalabilidade

Ambos podem escalar bem, desde que você pense em:

Na prática, o desafio não é só escolher a tecnologia, mas desenhar a arquitetura para suportar milhares de conexões simultâneas.

5. Recursos extras

Arquiteturas reais para aplicações em tempo real

Vamos para o mundo real. Como isso fica numa arquitetura minimamente profissional?

Cenário 1: Dashboard em tempo real de vendas

Exemplo: você tem um e-commerce e quer mostrar em um painel as vendas acontecendo ao vivo para o time de marketing.

Por que SSE aqui?

Cenário 2: Chat em tempo real entre usuários

Exemplo clássico: chat de suporte ou chat entre clientes.

Por que WebSocket aqui?

Um mini-guia prático: escolhendo entre WebSockets e SSE

Use como regra rápida:

Se você ainda está em dúvida, pense assim:

“Meu usuário precisa falar muito com o servidor em tempo real, ou ele só precisa ouvir o que está acontecendo?”

Exemplo prático simples com Server-Sent Events

Vamos montar um exemplo conceitual de SSE. A ideia não é copiar e colar, mas entender o fluxo.

No backend (exemplo em Node/Express):

Você cria um endpoint /events que mantém a conexão aberta e envia eventos:

// Exemplo didático (omitindo imports e tratamento de erros)app.get('/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); const sendEvent = (data) => { res.write(`data: ${JSON.stringify(data)}\n\n`); }; // Envia um "ping" inicial sendEvent({ message: 'conectado' }); // Exemplo: envia algo a cada 5s const interval = setInterval(() => { sendEvent({ timestamp: new Date().toISOString() }); }, 5000); req.on('close', () => { clearInterval(interval); });});

No frontend:

const source = new EventSource('/events');source.onmessage = (event) => { const data = JSON.parse(event.data); console.log('Novo evento:', data);};source.onerror = (err) => { console.error('Erro na conexão SSE', err);};

Com isso, você já tem um fluxo contínuo de dados do servidor para o cliente, sem precisar de WebSocket.

Exemplo prático simples com WebSockets

Agora, um fluxo didático usando WebSocket puro no navegador e um servidor simples.

No frontend:

const socket = new WebSocket('wss://seu-servidor.com/socket');socket.onopen = () => { console.log('Conectado!'); socket.send(JSON.stringify({ type: 'join', room: 'sala1' }));};socket.onmessage = (event) => { const data = JSON.parse(event.data); console.log('Mensagem recebida:', data);};socket.onerror = (err) => { console.error('Erro no WebSocket', err);};// Enviar mensagemfunction enviarMensagem(texto) { socket.send(JSON.stringify({ type: 'message', text: texto }));}

No backend, você usaria uma biblioteca específica dependendo da stack (por exemplo, ws em Node.js, canais em Rails, SignalR em .NET, etc.). O padrão é:

Cuidados para escalar aplicações em tempo real

É aqui que muitos projetos se complicam. Real time parece bonito no demo, mas o problema aparece quando você coloca 5.000 usuários simultâneos.

Alguns pontos essenciais:

1. Conexões persistentes custam memória

Cada conexão aberta ocupa recursos. Você precisa:

2. Balanceadores de carga precisam saber lidar com isso

Se você usa Nginx, Cloudflare, ELB, etc., precisa garantir:

3. Use um broker/pub-sub

Se você roda várias instâncias de backend, não dá para depender só de memória local. Use algo como:

A ideia é simples: um serviço publica um evento (ex: “nova venda”), todas as instâncias inscritas recebem, e cada uma transmite para seus clientes conectados.

4. Timeouts e reconexões

Checklist rápido antes de colocar em produção

Use esta lista como revisão final:

Próximas ações para colocar tudo isso em prática

Para não ficar só na teoria, aqui vai um plano simples que você pode seguir em 1–2 dias de trabalho focado.

Passo 1: Escolha um caso de uso pequeno

Passo 2: Defina se é caso de SSE ou WebSocket

Passo 3: Implemente um protótipo

Passo 4: Simule carga

Passo 5: Ajuste arquitetura

Desenvolver aplicações web em tempo real não é mais “luxo de big tech”. É algo acessível com ferramentas que você provavelmente já usa, como Node, PHP, Python, Redis, Nginx.

O diferencial não está só em saber “como fazer um WebSocket funcionar”, mas em escolher com consciência entre WebSockets e Server-Sent Events, e desenhar uma arquitetura que não quebre quando seu projeto começar a ganhar tração.

Se você já tem um projeto rodando hoje, o próximo passo é escolher um único ponto da sua aplicação para ficar em tempo real — e colocar em produção com cuidado. Depois disso, o resto vira evolução natural.

Quitter la version mobile