Jakie są dobre opcje kolejki wiadomości dla nodejs? [Zamknięte]

112

Chcę użyć kolejki komunikatów w małej aplikacji internetowej, którą tworzę za pomocą node.js. Spojrzałem na resque, ale nie byłem pewien, czy to właściwe. Celem jest wypychanie powiadomień do klientów na podstawie zaplecza i innych działań klienta za pomocą gniazda. Mógłbym to zrobić za pomocą samego socketio, ale pomyślałem, że może odpowiednia kolejka komunikatów sprawi, że będzie to czystsze i nie będę musiał wymyślać koła na nowo.

Jakie są dostępne opcje?

Bjorn
źródło
2
Nie jestem pewien, ale wygląda na to, że węzeł sam się dobrze poradzi!
TK-421
Prawdopodobnie już o tym wiesz, ale jeden jest wymieniony na stronie Moduły: github.com/ry/node/wiki/modules#message-queue . Myślę, że zawsze trzeba wziąć pod uwagę koszt własnego czasu rozwoju.
TK-421
5
@ TK-421 i Bjorn Tipling To rzeczywiście coś, co węzeł może zrobić sam, o ile masz tylko jeden proces węzłowy. Rozwiązanie zewnętrzne, takie jak Redis, jest potrzebne, jeśli masz różne procesy dla różnych części aplikacji (np. Serwer WWW, dostawca autoryzacji, centrum notif itp.). Oczywiście możesz również połączyć się z procesami innymi niż węzły.
Louis Chatriot
1
Przykłady używania Node AMQ i Rabbit MQ (producent) gist.github.com/DarcInc/9641557 i (Consumer) gist.github.com/DarcInc/9641582
ipaul
1
Jeśli potrzebujesz kolejki w pamięci, możesz rozważyć to rozwiązanie oparte na rxjs
Marinos An

Odpowiedzi:

51

możesz użyć redis z błyskawicznym klientem node_redis . Ma nawet wbudowaną semantykę pubsub .

Alfred
źródło
7
Polecam użycie dobrego modułu kolejkowania na szczycie redis, podobnie jak RSMQ, który wydaje się być dość prosty. npmjs.com/package/rsmq
Exinferis
jeśli chcesz po prostu mocy przesyłania wiadomości bez wkradających się problemów technicznych, możesz spróbować node-ts.github.io/bus
Andrew dh
12

Możesz użyć klienta STOMP węzła . Umożliwiłoby to integrację z różnymi kolejkami wiadomości, w tym:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Nie korzystałem wcześniej z tej biblioteki, więc nie mogę ręczyć za jej jakość. Ale STOMP to dość prosty protokół, więc podejrzewam, że w razie potrzeby możesz go włamać do przedłożenia.

Inną opcją jest użycie beanstalkd z node . beanstalkd to bardzo szybka "kolejka zadań" napisana w C, która jest bardzo dobra, jeśli nie potrzebujesz elastyczności funkcji wymienionych powyżej brokerów.

James Cooper
źródło
10

Bezwstydna wtyczka: Pracuję nad Bokeh : prostą, skalowalną i niesamowicie szybką kolejką zadań zbudowaną na ZeroMQ. Obsługuje wtykowe magazyny danych dla trwałych zadań, obecnie w pamięci, obsługiwane są Redis i Riak. Sprawdź to.

Josh Bassett
źródło
10

Oto kilka zaleceń, które mogę przedstawić:

node-amqp : klient RabbitMQ , którego z powodzeniem użyłem w połączeniu z Socket.IO, aby między innymi stworzyć grę wieloosobową w czasie rzeczywistym i aplikację do czatu. Wydaje się wystarczająco wiarygodne.

zeromq.node : Jeśli chcesz skorzystać z trasy nieobsługiwanej przez brokera, może to być warte obejrzenia. Więcej pracy przy implementacji funkcjonalności, ale istnieje większe prawdopodobieństwo, że uzyskasz mniejsze opóźnienia i wyższą przepustowość.

RobotEyes
źródło
1
+1 za używanie ZeroMQ. Po wielu badaniach i czasie spędzonym na majstrowaniu przy łodygach fasoli, RabbitMQ, BeeQueue, Bull i Kue, ZeroMQ okazał się dla mnie najlepszym doświadczeniem, szczególnie w przypadku lekkich projektów obsługiwanych przez pracowników. Jest błyskawiczny, a dokumentacja na najwyższym poziomie. Ma również tę dodatkową zaletę, że nie zatyka serwera Redis dużą liczbą połączeń.
dimiguel
zeromq.nodeteraz utrzymywane tutaj: zeromq.js
Marinos An
8

Spójrz na node-busmq - to wysokiej jakości, wysoce dostępna i skalowalna magistrala komunikatów wspierana przez redis.

Napisałem ten moduł dla naszej globalnej chmury i obecnie jest on wdrażany w naszym środowisku produkcyjnym w kilku centrach danych na całym świecie. Obsługuje nazwane kolejki, komunikację peer-to-peer, gwarantowaną dostawę i federację.

Aby uzyskać więcej informacji o tym, dlaczego stworzyliśmy ten moduł, możesz przeczytać ten wpis na blogu: Wszyscy na pokład magistrali wiadomości

fujifish
źródło
6

kue to jedyna kolejka wiadomości, jakiej kiedykolwiek będziesz potrzebować

Pono
źródło
27
poza tym, że kue nie jest dobrze utrzymany, ma kilka problemów i nie ma ani jednego testu!
vvo
4
Ponadto jest to kolejka zadań - a nie kolejka wiadomości
HyderA
Ma kilka problemów i nie nadaje się do produkcji
Rahul Kumar
1
Używanie bullbyło dla mnie prostsze. Z kuezagubiłem się w dokumentacji.
Marinos An
5

Polecam wypróbować Kestrel , jest szybki i prosty jak Beanstalk, ale obsługuje kolejki fanoutów. Mówi memcached. Jest zbudowany przy użyciu Scala i używany na Twitterze.

Eduardo Raad
źródło
7
Warto zauważyć, że Kestrel nie jest już w aktywnym rozwoju.
GordyD
3

Możesz rzucić okiem

Redis Simple Message Queue dla Node.js.

Który używa Redis i oferuje większość funkcji Amazons SQS.

Smrchy
źródło
1
Chociaż RSMQ jest fajny i kiedyś pracował dla mnie w produkcji, pamiętaj, że używa skryptów Lua w Redis i nie będzie działać z konfiguracją klastra / wartownika Redis
naugtur
2

A co z usługą Azure ServiceBus? Obsługuje nodejs.

Ben
źródło
1

Spójrz na node-queue-lib . Może wystarczy, że ty. Obsługuje node.js i przeglądarki. Ma dwie strategie wyświetlania: transmisja i okrężna. Tylko javascript.

Szybki przykład:

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
źródło
1

Użyłem KUE z socketIO, jak opisałeś. Zapisałem socketID z zadaniem i mogłem go odzyskać w Zadaniu zakończonym. KUE jest oparty na redis i ma dobre przykłady na github

coś takiego....

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
źródło