Quali sono le buone opzioni per la coda dei messaggi per nodejs? [chiuso]


112

Sto cercando di utilizzare una coda di messaggi in una piccola app Web che sto creando con node.js. Ho guardato resque ma non sono sicuro che sia appropriato. L'obiettivo è inviare notifiche ai client in base al backend e ad altre azioni client con socketio. Potrei farlo solo con socketio, ma ho pensato che forse una coda di messaggi adeguata avrebbe reso tutto più pulito e non avrei dovuto reinventare la ruota.

Quali sono le opzioni disponibili?


2
Non sono sicuro, ma sembra che un nodo farebbe bene da solo!
TK-421

Probabilmente ne sei già a conoscenza, ma ce n'è uno elencato nella pagina Moduli: github.com/ry/node/wiki/modules#message-queue . Immagino che ci sia sempre il costo del tuo tempo di sviluppo da considerare.
TK-421

5
@ TK-421 e Bjorn Tipling Questo è davvero qualcosa che il nodo può fare da solo, a patto che tu abbia un solo processo di nodo. È necessaria una soluzione esterna come Redis se si dispone di processi diversi per parti diverse dell'applicazione (ad es. Server web, provider di autenticazione, centro notifiche ecc.). E ovviamente puoi connetterti anche con processi non di nodo.
Louis Chatriot

1
Esempi di utilizzo di Node AMQ e Rabbit MQ (Producer) gist.github.com/DarcInc/9641557 e (Consumer) gist.github.com/DarcInc/9641582
ipaul

1
Nel caso abbiate bisogno di una coda in memoria, potete prendere in considerazione questa soluzione basata su rxjs
Marinos An

Risposte:



12

È possibile utilizzare il client STOMP del nodo . Ciò ti consentirebbe di integrarti con una varietà di code di messaggi, tra cui:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Non ho mai utilizzato questa libreria prima d'ora, quindi non posso garantirne la qualità. Ma STOMP è un protocollo piuttosto semplice, quindi sospetto che tu possa hackerarlo in sottomissione se necessario.

Un'altra opzione è usare beanstalkd con node . beanstalkd è una "coda di attività" molto veloce scritta in C che è molto buona se non hai bisogno della flessibilità delle funzionalità dei broker sopra elencati.


10

Plug senza vergogna: sto lavorando su Bokeh : una coda di attività semplice, scalabile e velocissima basata su ZeroMQ. Supporta archivi dati collegabili per attività persistenti, attualmente in memoria, sono supportati Redis e Riak. Controlla.


10

Ecco un paio di consigli che posso dare:

node-amqp : un client RabbitMQ che ho utilizzato con successo in combinazione con Socket.IO per creare un gioco multiplayer in tempo reale e un'applicazione di chat tra le altre cose. Sembra abbastanza affidabile.

zeromq.node : se vuoi seguire il percorso non mediato, potrebbe valere la pena dare un'occhiata. Più lavoro per implementare la funzionalità ma è più probabile che tu ottenga una latenza inferiore e una velocità effettiva maggiore.


1
+1 sull'utilizzo di ZeroMQ. Dopo molte ricerche e tempo speso ad armeggiare con beanstalkd, RabbitMQ, BeeQueue, Bull e Kue, ZeroMQ ha finito per essere la migliore esperienza per me, soprattutto per i progetti leggeri alimentati dai lavoratori. È velocissimo e la documentazione è di prim'ordine. Ha anche l'ulteriore vantaggio di non intasare il tuo server Redis con una grande quantità di chiamate.
dimiguel

zeromq.nodeora mantenuto qui: zeromq.js
Marinos An

8

Dai un'occhiata a node-busmq : è un bus di messaggi di livello di produzione, altamente disponibile e scalabile supportato da redis.

Ho scritto questo modulo per il nostro cloud globale ed è attualmente distribuito nel nostro ambiente di produzione in diversi data center in tutto il mondo. Supporta code denominate, comunicazione peer-to-peer, consegna garantita e federazione.

Per ulteriori informazioni sul motivo per cui abbiamo creato questo modulo puoi leggere questo post del blog: Tutti a bordo del bus dei messaggi


6

kue è l'unica coda di messaggi di cui avresti mai bisogno


27
tranne che kue non è ben mantenuto, ha diversi problemi e non un solo test!
vvo

4
Inoltre, è una coda di lavoro, non una coda di messaggi
HyderA

Ha diversi problemi e non è adatto per la produzione
Rahul Kumar

1
L'utilizzo è bullstato più semplice per me. Con kuemi ero perso nella documentazione.
Marinos An

5

Consiglio di provare Kestrel , è veloce e semplice come Beanstalk ma supporta le code di fan-out. Parla memcached. È costruito utilizzando Scala e utilizzato su Twitter.


7
Vale la pena notare che Kestrel non è più in fase di sviluppo attivo.
GordyD

3

Potresti voler dare un'occhiata

Redis Simple Message Queue per Node.js

Che utilizza Redis e offre la maggior parte delle funzionalità di Amazons SQS.


1
Mentre RSMQ è carino e ha funzionato per me in produzione una volta, tieni presente che sta usando gli script Lua in Redis e non funzionerà con la configurazione del cluster / sentinella Redis
naugtur

2

Che ne dici di Azure ServiceBus? Supporta nodejs.


1

Guarda node-queue-lib . Forse è abbastanza che tu. Supporta node.js e browser. Ha due strategie di consegna: trasmissione e round robin. Solo javascript.

Esempio veloce:

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

Ho usato KUE con socketIO come hai descritto. Ho memorizzato il socketID con il lavoro e potrei quindi recuperarlo in Job Complete .. KUE è basato su redis e ha buoni esempi su github

qualcosa come questo....

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.