2011-09-21 6 views
9

ho scritto un piccolo test per un semplice scenario:Redis/RabbitMQ - Pub/Sub - Performances

un editore e uno sottoscrittore

Editore trasmetta 1000000 messaggi

Subscriber ricevono i 1000000 messaggi

Primo test con RabbitMQ, scambio fanout, tipo di nodo RabbitMq Ram: 320 secondi

Secondo test con Redis, base p ub/Sub: 24 secondi

Mi manca qualcosa? Perché una tale differenza? È un problema di configurazione o qualcosa del genere?

Primo scenario: un processo node.js per l'abbonato, uno per l'editore, ciascuno, una connessione a rabbitmq con modulo nodo amqp. Secondo scénario: un processo node.js per l'abbonato, uno per l'editore, ognuno ha una connessione ai redis.

Qualsiasi aiuto è il benvenuto per capire ... Posso condividere il codice se necessario.

Sono abbastanza nuovo a tutto questo. Quello che mi serve, è un sistema di messaggistica/sottotitoli ad alte prestazioni. Mi piacerebbe avere capacità di clustering.

Per eseguire il mio test, ho solo avviare il server RabbitMQ (configurazione di default) e Io uso il seguente

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

Hai trovato una risposta a questo? –

risposta

22

Controllare assicurarsi che:

  • La coda RabbitMQ non è configurato come persistenti (dal momento che richiederebbe disco scrive per ogni messaggio)
  • tuo numero di prefetch sul lato abbonato è 0
  • Non si sta utilizzando operazioni o editore conferma

Ci sono altre cose che potrebbero essere sintonizzate, ma senza conoscere i dettagli del tuo test è difficile da indovinare. Mi piacerebbe solo che tu stia confrontando "mele con mele".

La maggior parte dei prodotti di messaggistica può essere fatta per andare il più velocemente possibile a scapito di varie garanzie (come la garanzia di consegna, ecc.) Quindi assicurati di aver compreso prima i requisiti della tua applicazione. Se il tuo unico requisito è che i dati vengano spalati dal punto A al punto B e puoi tollerare la perdita di alcuni messaggi, praticamente tutti i sistemi di messaggistica disponibili possono farlo e farlo bene. La parte più difficile è capire cosa ti serve oltre la velocità massima e accordare per soddisfare anche questi requisiti.