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?


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:



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.


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.


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ść.


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


6

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


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.


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.


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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.