Quais são as boas opções de fila de mensagens para nodejs? [fechadas]

112

Estou tentando usar uma fila de mensagens em um pequeno aplicativo da web que estou construindo com node.js. Eu olhei para resque, mas não tenho certeza se é apropriado. O objetivo é enviar notificações por push aos clientes com base no back-end e outras ações do cliente com socketio. Eu poderia fazer isso apenas com socketio, mas pensei que talvez uma fila de mensagens adequada tornaria isso mais limpo e eu não teria que reinventar a roda.

Quais são as opções lá fora?

Bjorn
fonte
2
Não tenho certeza, mas isso parece algo que o nó faria bem por si só!
TK-421 de
Você provavelmente já sabe disso, mas há um listado na página Módulos: github.com/ry/node/wiki/modules#message-queue . Acho que sempre há o custo do seu próprio tempo de desenvolvimento a ser considerado.
TK-421 de
5
@ TK-421 e Bjorn Tipling Isso é realmente algo que o nó pode fazer sozinho, contanto que você tenha apenas um processo de nó. Uma solução externa como Redis é necessária se você tiver processos diferentes para diferentes partes de seu aplicativo (ou seja, servidor da web, provedor de autenticação, centro de notificação, etc.). E, claro, você também pode conectar-se a processos que não são do nó.
Louis Chatriot
1
Exemplos usando Node AMQ e Rabbit MQ (Produtor) gist.github.com/DarcInc/9641557 e (Consumidor) gist.github.com/DarcInc/9641582
ipaul
1
No caso de você precisar de uma fila na memória, você pode considerar esta solução baseada em rxjs
Marinos An

Respostas:

51

você pode usar o redis com o cliente node_redis extremamente rápido . Ele ainda tem semântica pubsub integrada .

Alfred
fonte
7
Eu recomendo usar um bom módulo de enfileiramento em cima do redis, assim como o RSMQ, que parece ser bem simples. npmjs.com/package/rsmq
Exinferis
se você quer apenas o poder das mensagens sem as preocupações técnicas se intrometendo,
Andrew dh
12

Você pode usar o cliente STOMP do nó . Isso permitiria a integração com uma variedade de filas de mensagens, incluindo:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Nunca usei essa biblioteca antes, então não posso garantir sua qualidade. Mas STOMP é um protocolo muito simples, então eu suspeito que você pode hackear até o envio, se necessário.

Outra opção é usar beanstalkd com o nó . beanstalkd é uma "fila de tarefas" muito rápida escrita em C que é muito boa se você não precisa da flexibilidade de recursos dos brokers listados acima.

James Cooper
fonte
10

Plugue sem vergonha: Estou trabalhando no Bokeh : uma fila de tarefas simples, escalonável e extremamente rápida construída no ZeroMQ. Ele suporta armazenamentos de dados conectáveis ​​para tarefas persistentes, atualmente na memória, Redis e Riak são suportados. Confira.

Josh Bassett
fonte
10

Aqui estão algumas recomendações que posso fazer:

node-amqp : Um cliente RabbitMQ que usei com sucesso em combinação com Socket.IO para fazer um jogo multijogador em tempo real e um aplicativo de bate-papo, entre outras coisas. Parece confiável o suficiente.

zeromq.node : Se você quiser seguir a rota não intermediada, vale a pena dar uma olhada. Mais trabalho para implementar a funcionalidade, mas é mais provável que você obtenha menor latência e maior rendimento.

RobotEyes
fonte
1
1 sobre como usar ZeroMQ. Depois de muita pesquisa e tempo gasto mexendo com beanstalkd, RabbitMQ, BeeQueue, Bull e Kue, ZeroMQ acabou sendo a melhor experiência para mim, especialmente para projetos leves movidos por trabalhadores. É extremamente rápido e a documentação é de primeira qualidade. Ele também tem a vantagem de não obstruir o servidor Redis com uma grande quantidade de chamadas.
Dimiguel
zeromq.nodeagora mantido aqui: zeromq.js
Marinos An
8

Dê uma olhada em node-busmq - é um barramento de mensagem de nível de produção, altamente disponível e escalável apoiado por redis.

Escrevi este módulo para nossa nuvem global e atualmente está implantado em nosso ambiente de produção em vários datacenters ao redor do mundo. Ele oferece suporte a filas nomeadas, comunicação ponto a ponto, entrega e federação garantidas.

Para obter mais informações sobre por que criamos este módulo, você pode ler esta postagem do blog: All Aboard The Message Bus

fujifish
fonte
6

kue é a única fila de mensagens que você precisa

Pono
fonte
27
exceto que o kue não é bem mantido, tem vários problemas e nenhum teste!
vvo
4
Além disso, é uma fila de trabalho - não uma fila de mensagens
HyderA
Tem vários problemas e não está apto para produção
Rahul Kumar
1
Usar bullfoi mais direto para mim. Com kueeu estava perdido na documentação.
Marinos An
5

Eu recomendo tentar o Kestrel , é rápido e simples como o Beanstalk, mas suporta fanout filas. Fala memcached. Ele é construído usando Scala e usado no Twitter.

Eduardo raad
fonte
7
É importante notar que Kestrel não está mais em desenvolvimento ativo.
GordyD
3

Você pode querer dar uma olhada em

Redis Simple Message Queue para Node.js

Que usa Redis e oferece a maioria dos recursos do Amazons SQS.

Smrchy
fonte
1
Embora o RSMQ seja bom e tenha funcionado para mim na produção uma vez, esteja ciente de que está usando scripts Lua no Redis e não funcionará com a configuração de cluster / sentinela do Redis
naugtur
2

Que tal o Azure ServiceBus? Ele suporta nodejs.

Ben
fonte
1

Olhe para node-queue-lib . Talvez seja o suficiente para você. Suporta node.js e navegadores. Tem duas estratégias de entrega: broadcast e round-robin. Apenas javascript.

Exemplo rápido:

var Queue = require('node-queue-lib/queue.core');

var queue = new Queue('Queue name', 'broadcast');

// subscribe on 'Queue name' messages
queue.subscribe(function (err, subscriber) {
    subscriber.on('error', function(err){
        //
    });
    subscriber.on('data', function (data, accept) {
        console.log(data);
        accept(); // accept process message
    });
});

// publish message
queue.publish('test');
AndyGrom
fonte
1

Usei KUE com socketIO como você descreveu. Eu armazenei o socketID com o trabalho e pude recuperá-lo no trabalho concluído. KUE é baseado em redis e tem bons exemplos no github

algo assim....

jobs.process('YourQueuedJob',10, function(job, done){
    doTheJob(job, done);
});


function doTheJob(job, done){
    var socket = io.sockets.sockets[job.data.socketId];
    try {
        socket.emit('news', { status : 'completed' , task : job.data.task });
    } catch(err){
        io.sockets.emit('news', { status : 'fail' , task : job.data.task , socketId: job.data.socketId});
    }
    job.complete();
}
Brian McAuliffe
fonte