WebSocket notifications: guia prático de implementação
Implementar WebSocket notifications exige mais do que abrir uma conexão. Este guia mostra o passo a passo real: autenticar, tratar reconexão e evitar o erro clássico de ignorar mensagens offline.
A maioria dos tutoriais de WebSocket notifications ensina a abrir a conexão e para por aí. O problema aparece depois: usuário fecha a aba, volta, e a notificação que deveria ter chegado sumiu. Implementar de verdade significa cobrir o ciclo inteiro, do handshake à reconexão.
Para implementar WebSocket notifications, abra uma conexão persistente entre cliente e servidor, autentique o usuário no handshake, escute eventos no servidor e emita mensagens para o cliente. Trate reconexão com backoff exponencial e mantenha um fallback para mensagens perdidas enquanto o usuário estava offline.
Passo 1: Estabeleça a conexão e autentique no handshake
No servidor, aceite a conexão e valide o token do usuário antes de registrar o socket. No cliente, use new WebSocket('wss://...') e envie o token no primeiro frame ou via query string.
Erro comum: autenticar depois de aceitar qualquer conexão. Isso abre espaço para sockets anônimos consumindo memória. Valide na entrada.
Passo 2: Defina o formato da mensagem
Padronize um envelope com type, payload e timestamp. O cliente decide o que renderizar com base no type, não no texto.
Dica: versione o formato desde o início. Quando você adicionar um novo tipo de notificação, clientes antigos ignoram sem quebrar.
Passo 3: Trate reconexão e mensagens offline
WebSocket cai. Rede instável, aba em background, servidor reiniciando. Implemente reconexão com backoff exponencial e, ao reconectar, peça ao servidor as notificações não entregues desde o último timestamp conhecido.
Sem isso, o usuário perde o evento e você perde a confiança dele no sistema.
Passo 4: Escale com cuidado
Um servidor único funciona em desenvolvimento. Em produção, com múltiplas instâncias, use um broker (Redis Pub/Sub, por exemplo) para distribuir eventos entre os nós. Cada instância mantém seus sockets e escuta o canal comum.
Checklist rápido
- Conexão autenticada no handshake
- Envelope de mensagem padronizado e versionado
- Reconexão com backoff exponencial
- Recuperação de mensagens offline por timestamp
- Broker para múltiplas instâncias
FAQ
WebSocket é obrigatório para notificações push?
Não. Push notifications no navegador usam a Push API com service workers, que funcionam mesmo com a aba fechada. WebSocket serve para notificações em tempo real enquanto o usuário está com a página aberta. Os dois podem coexistir.
Posso usar SSE em vez de WebSocket?
Sim, se a comunicação for só servidor para cliente. SSE é mais simples e reconecta sozinho. WebSocket vale quando você precisa de canal bidirecional, como chat ou confirmação de leitura.
Como testar reconexão localmente?
Derrube o servidor com Ctrl+C e observe o cliente. Se ele não tentar reconectar em alguns segundos, seu backoff não está implementado. Simule também perda de rede no DevTools.
Preciso de HTTPS para WebSocket?
Em produção, sim. Use wss:// (WebSocket sobre TLS). Navegadores bloqueiam ws:// em páginas HTTPS por mixed content.
Quantas conexões um servidor aguenta?
Depende de memória e file descriptors. Um servidor Node.js bem configurado lida com dezenas de milhares de conexões ociosas, mas o número cai conforme o tráfego de mensagens aumenta. Meça antes de prometer escala.