2011-09-21 13 views
9

me escribió una pequeña prueba para un escenario simple:Redis/RabbitMQ - Pub/Sub - Actuaciones

Un editor y un suscriptor

Editorial Enviarás 1000000 mensajes

suscriptor recibe las 1000000 mensajes

Primera prueba con RabbitMQ, fanout Exchange, tipo de nodo RabbitMq Ram: 320 segundos

Segunda prueba con Redis, basic p ub/Sub: 24 segundos

¿Echo de menos algo? ¿Por qué una gran diferencia? ¿Es esto un problema de configuración o algo así?

Primer escenario: un proceso node.js para el suscriptor, uno para el editor, cada uno, una conexión a rabbitmq con el módulo de nodo amqp. Segundo scénario: un proceso node.js para el suscriptor, uno para el editor, cada uno tiene una conexión a redis.

Cualquier ayuda es bienvenida para entender ... Puedo compartir el código si es necesario.

soy bastante nuevo en todo esto. Lo que necesito, es un sistema de mensajes pub/sub de altas prestaciones. Me gustaría tener capacidades de agrupamiento.

Para ejecutar mi prueba, me acaba de iniciar el servidor RabbitMQ (configuración por defecto) y utilizo el siguiente

Publisher.js

var sys = require('sys'); 
var amqp = require('amqp'); 
var nb_messages = process.argv[2]; 
var connection = amqp.createConnection({url: 'amqp://guest:[email protected]:5672'}); 

connection.addListener('ready', function() { 
    exchangeName = 'myexchange'; 
    var start = end = null; 
    var exchange = connection.exchange(exchangeName, {type: 'fanout'}, function(exchange){ 
     start = (new Date()).getTime(); 

     for(i=1; i <= nb_messages; i++){ 
      if (i%1000 == 0){ 
       console.log("x"); 
      } 
      exchange.publish("", "hello"); 
     } 

     end = (new Date()).getTime(); 
     console.log("Publishing duration: "+((end-start)/1000)+" sec"); 
     process.exit(0); 
    }); 
}); 

Subscriber.js

var sys = require('sys'); 
var amqp = require('amqp'); 
var nb_messages = process.argv[2]; 
var connection = amqp.createConnection({url: 'amqp://guest:[email protected]:5672'}); 

connection.addListener('ready', function() {  
    exchangeName = 'myexchange'; 
    queueName = 'myqueue'+Math.random(); 

    var queue = connection.queue(queueName, function (queue) { 
     queue.bind(exchangeName, ""); 
     queue.start  = false; 
     queue.nb_messages = 0; 

     queue.subscribe(function (message) { 
      if (!queue.start){ 
       queue.start = (new Date()).getTime(); 
      } 
      queue.nb_messages++; 
      if (queue.nb_messages % 1000 == 0){ 
       console.log('+'); 
      } 
      if (queue.nb_messages >= nb_messages){ 
       queue.end = (new Date()).getTime(); 
       console.log("Ending at "+queue.end); 
       console.log("Receive duration: "+((queue.end - queue.start)/1000)); 
       process.exit(0); 
      } 
     }); 
    }); 
}); 
+2

¿Has encontrado una respuesta a esto? –

Respuesta

22

Compruebe asegúrese de que:

  • Su cola RabbitMQ no está configurado como persistente (ya que eso requeriría escrituras en disco para cada mensaje)
  • Su recuento de captación previa en el lado del abonado es 0
  • No está utilizando transacciones o editorial confirma

Hay hay otras cosas que podrían ajustarse, pero sin conocer los detalles de su prueba es difícil de adivinar. Solo me aseguraría de que comparas "manzanas con manzanas".

La mayoría de los productos de mensajería pueden hacerse tan rápido como sea humanamente posible a expensas de diversas garantías (como garantía de entrega, etc.) así que asegúrese de comprender primero los requisitos de su aplicación. Si su único requisito es que los datos se descarguen desde el punto A al punto B y puede tolerar la pérdida de algunos mensajes, prácticamente todos los sistemas de mensajería que existen pueden hacerlo y hacerlo bien. La parte más difícil es descubrir lo que necesita más allá de la velocidad bruta, y sintonizar para cumplir esos requisitos también.

Cuestiones relacionadas