Was sind gute Optionen für die Nachrichtenwarteschlange für NodeJS? [geschlossen]


112

Ich möchte eine Nachrichtenwarteschlange in einer kleinen Web-App verwenden, die ich mit node.js erstelle. Ich habe mir resque angesehen, bin mir aber nicht sicher, ob das angemessen ist. Ziel ist es, Benachrichtigungen basierend auf Backend und anderen Clientaktionen mit Socketio an Clients zu senden. Ich könnte dies nur mit Socketio tun, aber ich dachte, eine richtige Nachrichtenwarteschlange würde dies sauberer machen und ich müsste das Rad nicht neu erfinden.

Welche Möglichkeiten gibt es da draußen?


2
Ich bin mir nicht sicher, aber dies scheint, als würde ein Knoten von sich aus gut funktionieren!
TK-421

Sie wissen das wahrscheinlich schon, aber auf der Seite "Module" ist eines aufgeführt: github.com/ry/node/wiki/modules#message-queue . Ich denke, es sind immer die Kosten für Ihre eigene Entwicklungszeit zu berücksichtigen.
TK-421

5
@ TK-421 und Björn Tipling Das ist in der Tat etwas, was der Knoten selbst tun kann, solange Sie nur einen Knotenprozess haben. Eine externe Lösung wie Redis ist erforderlich, wenn Sie unterschiedliche Prozesse für verschiedene Teile Ihrer Anwendung haben (z. B. Webserver, Authentifizierungsanbieter, Notif Center usw.). Natürlich können Sie sich dann auch mit Prozessen verbinden, die keine Knoten sind.
Louis Chatriot

1
Beispiele mit Node AMQ und Rabbit MQ (Produzent) gist.github.com/DarcInc/9641557 und (Verbraucher) gist.github.com/DarcInc/9641582
ipaul

1
Falls Sie eine In-Memory-Warteschlange benötigen, können Sie diese rxjs-basierte Lösung in
Marinos An

Antworten:



12

Sie können den Knoten STOMP-Client verwenden . Auf diese Weise können Sie eine Vielzahl von Nachrichtenwarteschlangen integrieren, darunter:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Ich habe diese Bibliothek noch nie benutzt, daher kann ich nicht für ihre Qualität bürgen. Aber STOMP ist ein ziemlich einfaches Protokoll, daher vermute ich, dass Sie es bei Bedarf in die Einreichung hacken können.

Eine andere Option ist die Verwendung von Beanstalkd mit Node . beanstalkd ist eine sehr schnelle "Task-Warteschlange" in C, die sehr gut ist, wenn Sie die Funktionsflexibilität der oben aufgeführten Broker nicht benötigen.


10

Schamloser Plug: Ich arbeite an Bokeh : einer einfachen, skalierbaren und blitzschnellen Task-Warteschlange, die auf ZeroMQ basiert. Es unterstützt steckbare Datenspeicher für persistente Aufgaben, derzeit im Speicher, Redis und Riak werden unterstützt. Hör zu.


10

Hier sind einige Empfehlungen, die ich aussprechen kann:

node-amqp : Ein RabbitMQ-Client, den ich erfolgreich in Kombination mit Socket.IO verwendet habe, um unter anderem ein Echtzeit-Mehrspieler-Spiel und eine Chat-Anwendung zu erstellen. Scheint zuverlässig genug.

zeromq.node : Wenn Sie den nicht vermittelten Weg gehen möchten, ist dies möglicherweise einen Blick wert. Mehr Arbeit für die Implementierung von Funktionen, aber mit größerer Wahrscheinlichkeit eine geringere Latenz und einen höheren Durchsatz.


1
+1 bei Verwendung von ZeroMQ. Nach viel Recherche und Zeit mit Basteln mit Bohnenstange, RabbitMQ, BeeQueue, Bull und Kue war ZeroMQ die beste Erfahrung für mich, insbesondere für Leichtbauprojekte, die von Arbeitern betrieben wurden. Es ist blitzschnell und die Dokumentation ist erstklassig. Es hat auch den zusätzlichen Vorteil, dass Ihr Redis-Server nicht durch eine große Anzahl von Anrufen verstopft wird.
Dimiguel

zeromq.nodejetzt hier gepflegt: zeromq.js
Marinos An

8

Schauen Sie sich Node-Busmq an - es handelt sich um einen produktionsfähigen, hochverfügbaren und skalierbaren Nachrichtenbus, der von Redis unterstützt wird.

Ich habe dieses Modul für unsere globale Cloud geschrieben und es wird derzeit in unserer Produktionsumgebung in mehreren Rechenzentren auf der ganzen Welt bereitgestellt. Es unterstützt benannte Warteschlangen, Peer-to-Peer-Kommunikation, garantierte Zustellung und Verbund.

Weitere Informationen darüber, warum wir dieses Modul erstellt haben, finden Sie in diesem Blogbeitrag: All Aboard The Message Bus


6

kue ist die einzige Nachrichtenwarteschlange, die Sie jemals benötigen würden


27
außer kue ist nicht gut gepflegt, hat mehrere probleme und keinen einzigen test!
Vvo

4
Es ist auch eine
Jobwarteschlange

Es hat mehrere Probleme und ist nicht für die Produktion geeignet
Rahul Kumar

1
Die Verwendung bullwar für mich einfacher. Mit war kueich in der Dokumentation verloren.
Marinos An

5

Ich empfehle Kestrel auszuprobieren, es ist schnell und einfach wie Beanstalk, unterstützt aber Fanout-Warteschlangen. Spricht zwischengespeichert. Es wurde mit Scala erstellt und bei Twitter verwendet.


7
Es ist erwähnenswert, dass sich Turmfalke nicht mehr in der aktiven Entwicklung befindet.
GordyD

3

Vielleicht möchten Sie einen Blick darauf werfen

Redis Simple Message Queue für Node.js

Welches verwendet Redis und bietet die meisten Funktionen von Amazons SQS.


1
Während RSMQ nett ist und einmal für mich in der Produktion gearbeitet hat, beachten Sie, dass es Lua-Skripte in Redis verwendet und nicht mit Redis Cluster / Sentinel-Setup
funktioniert

2

Wie wäre es mit Azure ServiceBus? Es unterstützt NodeJS.


1

Schauen Sie sich Node-Queue-Lib an . Vielleicht reicht es dir. Es unterstützt node.js und Browser. Hat zwei Lieferstrategien: Broadcast und Round-Robin. Nur Javascript.

Kurzes Beispiel:

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

Ich habe KUE mit socketIO verwendet, wie Sie es beschrieben haben. Ich habe die socketID mit dem Job gespeichert und konnte sie dann im Job Complete abrufen. KUE basiert auf redis und hat gute Beispiele für github

etwas wie das....

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.