2011-09-21 34 views
9

basit bir senaryo için küçük bir test yazdı:Redis/RabbitMQ - - Yayınlama/Performanslar

Bir yayıncı ve bir abone

Yayınevi 1000000 mesajlar

Abone 1000000 mesajları almak göndermek

İlk test RabbitMQ, fanout Değişim, RabbitMq düğüm türü Ram: 320 saniye

Redis ile ikinci test, temel p ub/Sub: 24 saniye

Bir şey mi eksik? Neden böyle bir fark var? Bu bir yapılandırma sorunu mu yoksa bir şey mi?

İlk senaryo: abone için bir node.js işlemi, biri yayıncı için, her biri, amqp düğümü modülü ile rabbitmq'e bir bağlantı. İkinci senaryo: abone için bir tane, bir yayıncı için bir node.js işlemi, her birinin bir redis için bir bağlantısı var.

Herhangi bir yardım anlamak için bir yardımcıdır ... Gerekirse kodu paylaşabilirim.

Tüm bunlara oldukça yeni yaşıyorum. İhtiyacım olan yüksek performans pub/alt mesajlaşma sistemidir. Kümeleme yeteneklerine sahip olmak isterim.

benim Testi yapmak için, ben sadece RabbitMQ sunucusu (varsayılan yapılandırma) başlatmak ve i için aşağıdaki

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

Buna bir cevap buldunuz mu? –

cevap

22

Kontrolü kullanmak emin olun:

  • Kişisel RabbitMQ kuyruğu abone tarafında
  • Kişisel önceden getirme sayımı Sen işlemleri veya yayıncı kullanmayan 0
  • (yani diskin her mesaj için yazıyor gerektirecektir) kalıcı olarak yapılandırılmış bulunmaktadır

doğrular değil ayarlanabilen diğer şeylerdir, ancak testinizin ayrıntılarını bilmeden tahmin etmek zordur. "Elmaları elmalarla" karşılaştırdığınızdan emin olurdum.

Çoğu mesajlaşma ürünleri, çeşitli garantiler (teslimat garantisi gibi) pahasına mümkün olduğunca hızlı bir şekilde gitmek için yapılabilir, bu nedenle öncelikle uygulamanızın gereksinimlerini anladığınızdan emin olun. Tek gereksiniminiz, A noktasından B noktasına geçecek ve bazı mesajların kaybına tahammül edebilecek veriler içinse, hemen hemen her mesajlaşma sistemi bunu yapabilir ve iyi yapabilir. Daha zor olan kısım, ham hızın ötesinde ihtiyacınız olanı bulmak ve bu gereksinimleri karşılamak için ayar yapmaktır.