Quelles sont les bonnes options de file d'attente de messages pour nodejs? [fermé]


112

Vous cherchez à utiliser une file d'attente de messages dans une petite application Web que je construis avec node.js. J'ai regardé resque mais je ne suis pas sûr que ce soit approprié. L'objectif est de transmettre des notifications aux clients en fonction du backend et d'autres actions client avec socketio. Je pourrais le faire avec juste socketio mais je pensais qu'une file d'attente de messages appropriée rendrait ce plus propre et je n'aurais pas à réinventer la roue.

Quelles sont les options disponibles?


2
Pas sûr, mais cela semble être quelque chose que le nœud ferait bien tout seul!
TK-421 du

Vous en êtes probablement déjà conscient, mais il y en a un sur la page Modules: github.com/ry/node/wiki/modules#message-queue . Je suppose qu'il y a toujours le coût de votre propre temps de développement à prendre en compte.
TK-421 du

5
@ TK-421 et Bjorn Tipling C'est en effet quelque chose que le nœud peut faire lui-même, tant que vous n'avez qu'un seul processus de nœud. Une solution externe telle que Redis est nécessaire si vous disposez de différents processus pour différentes parties de votre application (par exemple, serveur Web, fournisseur d'authentification, centre de notification, etc.). Et bien sûr, vous pouvez également vous connecter avec des processus non noeuds.
Louis Chatriot

1
Exemples utilisant Node AMQ et Rabbit MQ (Producer) gist.github.com/DarcInc/9641557 et (Consumer) gist.github.com/DarcInc/9641582
ipaul

1
Si vous avez besoin d'une file d'attente en mémoire, vous pouvez envisager cette solution basée sur rxjs
Marinos An

Réponses:



12

Vous pouvez utiliser le client STOMP de noeud . Cela vous permettrait de vous intégrer à une variété de files d'attente de messages, notamment:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Je n'ai jamais utilisé cette bibliothèque auparavant, je ne peux donc pas garantir sa qualité. Mais STOMP est un protocole assez simple, donc je suppose que vous pouvez le pirater en soumission si nécessaire.

Une autre option consiste à utiliser beanstalkd avec node . beanstalkd est une "file d'attente de tâches" très rapide écrite en C qui est très bonne si vous n'avez pas besoin de la flexibilité des fonctionnalités des courtiers listés ci-dessus.


10

Plug sans vergogne: je travaille sur Bokeh : une file d'attente de tâches simple, évolutive et ultra-rapide construite sur ZeroMQ. Il prend en charge les magasins de données enfichables pour les tâches persistantes, actuellement en mémoire, Redis et Riak sont pris en charge. Vérifiez-le.


10

Voici quelques recommandations que je peux faire:

node-amqp : Un client RabbitMQ que j'ai utilisé avec succès en combinaison avec Socket.IO pour créer un jeu multijoueur en temps réel et une application de chat, entre autres. Semble assez fiable.

zeromq.node : Si vous voulez emprunter la route non négociée, cela vaut peut-être la peine d'y jeter un coup d'œil. Plus de travail pour implémenter les fonctionnalités, mais vous êtes plus susceptible d'obtenir une latence plus faible et un débit plus élevé.


1
+1 sur l'utilisation de ZeroMQ. Après de nombreuses recherches et du temps passé à bricoler avec beanstalkd, RabbitMQ, BeeQueue, Bull et Kue, ZeroMQ a fini par être la meilleure expérience pour moi, en particulier pour les projets légers propulsés par des travailleurs. C'est ultra rapide et la documentation est de premier ordre. Il présente également l'avantage de ne pas encombrer votre serveur Redis avec un grand nombre d'appels.
dimiguel

zeromq.nodemaintenant maintenu ici: zeromq.js
Marinos An

8

Jetez un œil à node-busmq - il s'agit d'un bus de messages de niveau production, hautement disponible et évolutif soutenu par redis.

J'ai écrit ce module pour notre cloud mondial et il est actuellement déployé dans notre environnement de production dans plusieurs centres de données à travers le monde. Il prend en charge les files d'attente nommées, la communication peer-to-peer, la livraison garantie et la fédération.

Pour plus d'informations sur les raisons pour lesquelles nous avons créé ce module, vous pouvez lire ce billet de blog: Tous à bord du bus de messages


6

kue est la seule file d'attente de messages dont vous auriez besoin


27
sauf que kue n'est pas bien entretenu, a plusieurs problèmes et pas un seul test!
vvo

4
En outre, c'est une file d'attente de travaux - pas une file d'attente de messages
HyderA

Il a plusieurs problèmes et n'est pas apte à la production
Rahul Kumar

1
Utiliser bullétait plus simple pour moi. Avec kuej'étais perdu dans la documentation.
Marinos An

5

Je recommande d'essayer Kestrel , c'est rapide et simple comme Beanstalk mais prend en charge les files d'attente en éventail. Parle memcached. Il est construit avec Scala et utilisé sur Twitter.


7
Il est à noter que Kestrel n'est plus en développement actif.
GordyD

3

Vous voudrez peut-être jeter un œil à

Redis Simple Message Queue pour Node.js

Qui utilise Redis et offre la plupart des fonctionnalités d'Amazons SQS.


1
Bien que RSMQ soit sympa et ait travaillé pour moi en production une fois, sachez qu'il utilise des scripts Lua dans Redis et ne fonctionnera pas avec la configuration du cluster / sentinelle Redis
naugtur

2

Qu'en est-il d'Azure ServiceBus? Il prend en charge nodejs.


1

Regardez node-queue-lib . Peut-être suffit-il que vous. Il prend en charge node.js et les navigateurs. A deux stratégies de livraison: diffusion et round-robin. Seulement javascript.

Exemple rapide:

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

J'ai utilisé KUE avec socketIO comme vous l'avez décrit. J'ai stocké le socketID avec le travail et j'ai pu le récupérer dans le Job Complete .. KUE est basé sur redis et a de bons exemples sur github

quelque chose comme ça....

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.