Bibliotecas WebSocket para Node.js: do chat simples a sistemas de tempo real de alta carga
WebSocket é um protocolo que fornece uma conexão bidirecional permanente entre cliente e servidor. Diferentemente do HTTP, onde a requisição-resposta é iniciada pelo cliente, o WebSocket permite que o servidor envie dados a qualquer momento. Para o Node.js, conhecido por sua assincronicidade e arquitetura orientada a eventos, o WebSocket tornou-se uma escolha natural para criar chats, jogos online, terminais de negociação e transmissão de dados em fluxo.
Neste artigo, analisaremos três bibliotecas principais: ws (leve e rápida), Socket.IO (conveniente com mecanismos de fallback) e uWebSockets.js (desempenho recorde). Você aprenderá qual escolher para sua tarefa e como escrever um chat simples com cada uma delas.
1. Biblioteca ws — minimalismo e velocidade
ws é a biblioteca WebSocket mais popular para Node.js. Ela implementa o protocolo puro RFC 6455 sem camadas extras. Principais vantagens:
- Desempenho máximo — até 200.000+ mensagens/seg em um único núcleo.
- Zero dependências — apenas JavaScript puro.
- Controle total sobre a conexão: handshake, frames, ping/pong.
- Suporte a Node.js Buffer e Streams para dados binários.
Desvantagens: sem reconexão automática, sem salas (rooms), sem fallback para HTTP long-polling. Tudo precisa ser implementado manualmente ou através de pacotes adicionais.
Exemplo: servidor echo simples com ws
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => { console.log('Cliente conectado');
ws.on('message', (message) => { console.log('Recebido:', message.toString()); // Envia de volta (echo) ws.send(`Echo: ${message}`); });
ws.on('close', () => { console.log('Cliente desconectado'); });
// Envia saudação ao conectar ws.send('Bem-vindo ao servidor WebSocket!');});
console.log('Servidor iniciado em ws://localhost:8080');Quando escolher ws? — para microsserviços, jogos de alta carga (onde cada quadro é importante), para incorporação em seu próprio servidor HTTP (via server.on('upgrade')).
2. Socket.IO — conveniência e confiabilidade para produção
Socket.IO não é apenas WebSocket, mas uma plataforma de tempo real completa. Ela usa WebSocket como transporte principal, mas muda automaticamente para HTTP long-polling se o WebSocket não for suportado (proxies, firewalls, navegadores antigos).
- Salas (Rooms) — agrupamento de clientes para transmissões broadcast.
- Namespaces — divisão lógica da aplicação (ex.: /chat e /game).
- Reconexão automática com backoff exponencial.
- Suporte a eventos — você trabalha com eventos, não com mensagens brutas.
- Serialização integrada — envio de objetos JSON sem parsing manual.
Desvantagens: overhead de protocolo (pacotes extras com metadados), mais dependências, um pouco mais lento que ws puro.
Exemplo: chat com salas no Socket.IO (servidor)
const http = require('http');const { Server } = require('socket.io');
const server = http.createServer();const io = new Server(server, { cors: { origin: '*' } // para desenvolvimento});
io.on('connection', (socket) => { console.log('Novo cliente:', socket.id);
// Entrar em uma sala socket.on('join_room', (roomName) => { socket.join(roomName); socket.emit('message', `Você entrou na sala ${roomName}`); socket.to(roomName).emit('message', `Usuário ${socket.id} entrou na sala`); });
// Enviar mensagem para a sa