¿Cuáles son las buenas opciones de cola de mensajes para nodejs? [cerrado]

112

Estoy buscando usar una cola de mensajes en una pequeña aplicación web que estoy construyendo con node.js. Miré resque pero no estoy seguro de que sea apropiado. El objetivo es enviar notificaciones a los clientes en función del backend y otras acciones del cliente con socketio. Podría hacer esto solo con socketio, pero pensé que tal vez una cola de mensajes adecuada haría esto más limpio y no tendría que reinventar la rueda.

¿Cuáles son las opciones que existen?

Bjorn
fuente
2
No estoy seguro, ¡pero esto parece que el nodo haría bien por sí solo!
TK-421
Probablemente ya sepa esto, pero hay uno en la página de Módulos: github.com/ry/node/wiki/modules#message-queue . Supongo que siempre hay que considerar el costo de su propio tiempo de desarrollo.
TK-421
5
@ TK-421 y Bjorn Tipling Eso es, de hecho, algo que el nodo puede hacer por sí mismo, siempre que solo tenga un proceso de nodo. Se necesita una solución externa como Redis si tiene diferentes procesos para diferentes partes de su aplicación (es decir, servidor web, proveedor de autenticación, centro de notificaciones, etc.). Y, por supuesto, también puede conectarse con procesos que no sean de nodo.
Louis Chatriot
1
Ejemplos de uso de Node AMQ y Rabbit MQ (Producer) gist.github.com/DarcInc/9641557 y (Consumer) gist.github.com/DarcInc/9641582
ipaul
1
En caso de que necesite una cola en memoria, puede considerar esta solución basada en rxjs
Marinos An

Respuestas:

12

Puede utilizar el cliente STOMP del nodo . Esto le permitiría integrarse con una variedad de colas de mensajes que incluyen:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

No he usado esta biblioteca antes, así que no puedo garantizar su calidad. Pero STOMP es un protocolo bastante simple, por lo que sospecho que puede piratearlo para enviarlo si es necesario.

Otra opción es usar beanstalkd con node . beanstalkd es una "cola de tareas" muy rápida escrita en C que es muy buena si no necesita la flexibilidad de funciones de los corredores enumerados anteriormente.

James Cooper
fuente
10

Enchufe descarado: estoy trabajando en Bokeh : una cola de tareas simple, escalable y ultrarrápida construida en ZeroMQ. Admite almacenes de datos conectables para tareas persistentes, actualmente en memoria, se admiten Redis y Riak. Echale un vistazo.

Josh Bassett
fuente
10

Aquí hay un par de recomendaciones que puedo hacer:

node-amqp : un cliente RabbitMQ que he usado con éxito en combinación con Socket.IO para hacer un juego multijugador en tiempo real y una aplicación de chat, entre otras cosas. Parece lo suficientemente confiable.

zeromq.node : si desea seguir la ruta sin intermediarios, puede valer la pena echarle un vistazo. Más trabajo para implementar la funcionalidad, pero es más probable que obtenga menor latencia y mayor rendimiento.

RobotEyes
fuente
1
+1 sobre el uso de ZeroMQ. Después de mucha investigación y tiempo jugando con beanstalkd, RabbitMQ, BeeQueue, Bull y Kue, ZeroMQ terminó siendo la mejor experiencia para mí, especialmente para proyectos livianos impulsados ​​por trabajadores. Es increíblemente rápido y la documentación es de primera categoría. También tiene el beneficio adicional de no obstruir su servidor Redis con una gran cantidad de llamadas.
Dimiguel
zeromq.nodeahora mantenido aquí: zeromq.js
Marinos An
8

Eche un vistazo a node-busmq : es un bus de mensajes escalable, de alta disponibilidad y de grado de producción respaldado por redis.

Escribí este módulo para nuestra nube global y actualmente está implementado en nuestro entorno de producción en varios centros de datos de todo el mundo. Admite colas con nombre, comunicación entre pares, entrega garantizada y federación.

Para obtener más información sobre por qué creamos este módulo, puede leer esta publicación de blog: Todos a bordo del bus de mensajes

Fujifish
fuente
6

kue es la única cola de mensajes que necesitarías

Pono
fuente
27
excepto que kue no está bien mantenido, tiene varios problemas y ni una sola prueba.
vvo
4
Además, es una cola de trabajos, no una cola de mensajes
HyderA
Tiene varios problemas y no es apto para producción
Rahul Kumar
1
Usar bullfue más sencillo para mí. Con kueestaba perdido en la documentación.
Marinos An
5

Recomiendo probar Kestrel , es rápido y simple como Beanstalk pero admite colas de distribución. Habla memcached. Está construido con Scala y se usa en Twitter.

Eduardo Raad
fuente
7
Vale la pena señalar que Kestrel ya no se encuentra en desarrollo activo.
GordyD
3

Es posible que desee echar un vistazo a

Cola de mensajes simple de Redis para Node.js

Que usa Redis y ofrece la mayoría de las funciones de Amazons SQS.

Smrchy
fuente
1
Mientras RSMQ es agradable y ha estado trabajando para mí en la producción de una vez, tener en cuenta que se trata de utilizar los scripts Lua en Redis y no funcionarán con Redis cluster / centinela configuración
naugtur
2

¿Qué hay de Azure ServiceBus? Es compatible con nodejs.

Ben
fuente
1

Mire node-queue-lib . Quizás sea suficiente que tú. Es compatible con node.js y navegadores. Tiene dos estrategias de entrega: transmisión y round-robin. Solo javascript.

Ejemplo rápido:

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
fuente
1

Usé KUE con socketIO como lo describiste. Guardé el socketID con el trabajo y luego pude recuperarlo en el trabajo completo. KUE se basa en redis y tiene buenos ejemplos en github

algo como esto....

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
fuente