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?


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:



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.


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.


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.


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


6

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


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.


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.


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.


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');

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();
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.