Qual biblioteca de websocket para usar com o Node.js?

Atualmente, há uma infinidade de bibliotecas websocket para node.js, as mais populares parecem ser:

  • https://github.com/Worlize/WebSocket-Node
  • https://github.com/einaros/ws
  • https://github.com/LearnBoost/engine.io
  • https://github.com/learnboost/socket.io
  • https://github.com/sockjs

No entanto, não consigo encontrar nenhuma comparação concreta sólida entre qualquer um deles … Aparentemente, o Socket.io foi incrível, mas tornou-se bastante antiquado e tem falhas na construção. Tanto ws quanto websocket-node afirmam que são os mais rápidos. E engine.io parece novo, mas muito mais pesado do que as metas mais leves.

Seria incrível se nós ou alguém pudéssemos reunir uma resposta que sirva de guia sobre qual biblioteca de sockets usar e quando, assim como uma comparação entre eles.

Começando a bola rolar com esta resposta do wiki da comunidade . Sinta-se à vontade para me editar com suas melhorias.

  • ws Servidor WebSocket e cliente para node.js. Uma das bibliotecas mais rápidas, se não a mais rápida.

  • Websocket-node Servidor WebSocket e cliente para node.js

  • websocket-driver-node Servidor WebSocket e analisador de protocolo do cliente node.js – usado no nó faye-websocket

  • faye-websocket-node Servidor e cliente WebSocket para node.js – usado em faye e sockjs

  • socket.io Servidor WebSocket e cliente para node.js + client para navegadores + (v0 tem o mais novo para o mais antigo fallbacks, v1 do Socket.io usa engine.io) + channels – usado em stack.io. A biblioteca cliente tenta reconectar após a desconexão.

  • sockjs WebSocket servidor e cliente para node.js e outros + cliente para navegadores + mais recentes para os mais antigos substitutos

  • faye WebSocket servidor e cliente para node.js e outros + cliente para navegadores + fallbacks + suporte para outros idiomas do lado do servidor

  • deepstream.io servidor em tempo real clusterizável que manipula WebSockets e conexões TCP e fornece synchronization de dados, publicação / sub e solicitação / resposta

  • cluster de servidor socketcluster WebSocket que faz uso de todos os núcleos de CPU em sua máquina. Por exemplo, se você usasse uma instância do xlarge Amazon EC2 com 32 núcleos, seria capaz de manipular quase 32 vezes o tráfego em uma única instância.

  • primus Fornece uma API comum para a maioria das bibliotecas acima para facilitar a mudança + melhorias de estabilidade para todos eles.

Quando usar:

  • use os servidores WebSocket básicos quando quiser usar as implementações nativas do WebSocket no clientide, cuidado com as incompatibilidades do navegador

  • usar as bibliotecas de fallback quando você se preocupa com fallbacks do navegador

  • use as bibliotecas completas quando você se preocupa com os canais

  • use o primus quando você não tiver ideia sobre o que usar, não estiver com disposição para rewrite seu aplicativo quando precisar alternar as estruturas devido à alteração dos requisitos do projeto ou à necessidade de estabilidade adicional da conexão.

Atualização: Esta resposta está desatualizada, pois versões mais recentes das bibliotecas mencionadas são lançadas desde então.

O Socket.IO v0.9 está desatualizado e com um pouco de bugs, e o Engine.IO é o sucessor interino. O Socket.IO v1.0 (que será lançado em breve) usará o Engine.IO e será muito melhor que o v0.9. Eu recomendo que você use o Engine.IO até que o Socket.IO v1.0 seja lançado.

“ws” não suporta fallback, portanto, se o navegador do cliente não suportar websockets, ele não funcionará, ao contrário do Socket.IO e do Engine.IO, que usam polling longo, etc., se os websockets não estiverem disponíveis. No entanto, “ws” parece ser a biblioteca mais rápida no momento.

Veja meu artigo comparando Socket.IO, Engine.IO e Primus: https://medium.com/p/b63bfca0539

npm ws foi a resposta para mim. Eu achei menos intrusivo e mais direto. Com isso também era trivial misturar websockets com serviços de descanso. Código simples compartilhado nesta postagem.

 var WebSocketServer = require("ws").Server; var http = require("http"); var express = require("express"); var port = process.env.PORT || 5000; var app = express(); app.use(express.static(__dirname+ "/../")); app.get('/someGetRequest', function(req, res, next) { console.log('receiving get request'); }); app.post('/somePostRequest', function(req, res, next) { console.log('receiving post request'); }); app.listen(80); //port 80 need to run as root console.log("app listening on %d ", 80); var server = http.createServer(app); server.listen(port); console.log("http server listening on %d", port); var userId; var wss = new WebSocketServer({server: server}); wss.on("connection", function (ws) { console.info("websocket connection open"); var timestamp = new Date().getTime(); userId = timestamp; ws.send(JSON.stringify({msgType:"onOpenConnection", msg:{connectionId:timestamp}})); ws.on("message", function (data, flags) { console.log("websocket received a message"); var clientMsg = data; ws.send(JSON.stringify({msg:{connectionId:userId}})); }); ws.on("close", function () { console.log("websocket connection close"); }); }); console.log("websocket server created");