2011-09-21 95 views
9

我寫了一個小測試一個簡單的場景:的Redis/RabbitMQ的 - 的Pub/Sub - 性能

一個發佈者和一個用戶

出版商送百萬的消息

用戶收到1000000個消息

第一次用RabbitMQ測試,扇出交換,RabbitMq節點類型Ram:320秒

用Redis進行第二次測試,基本爲p ub/Sub:24秒

我錯過了什麼嗎?爲什麼有這樣的差異?這是一個配置問題或什麼?

第一種情況:訂閱者需要一個node.js進程,發佈者需要一個node.js進程,每個進程需要一個到具有amqp節點模塊的rabbitmq連接。 第二個分區:訂戶的一個node.js進程,一個用於發佈者,每個進程都有一個到redis的連接。

任何幫助都很好理解......如果需要,我可以共享代碼。

我對所有這些都很陌生。 我需要的是一個高性能的酒吧/消息系統。我想擁有集羣功能。

運行我的測試,我只是啓動的RabbitMQ服務器(默認配置)和我用下面的

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

您是否找到了答案? –

回答

22

檢查到確保:

  • 您的RabbitMQ隊列未配置爲持續性(因爲這將需要磁盤寫入每個消息)在用戶側
  • 你的預取計數爲0
  • 您沒有使用事務處理或發行商確認

有是可以調整的其他東西,但不知道測試的細節很難猜測。我會確保你比較「蘋果與蘋果」。

大多數消息傳遞產品可以儘可能以人性化的速度運行,但需要犧牲各種保證(如交付保證等),因此請確保您首先了解您的應用程序需求。如果您的唯一要求是將數據從A點剷除到B點,並且您可以容忍某些郵件的丟失,那麼幾乎每個郵件系統都可以做到這一點,並且做得很好。更難的部分是弄清楚除了原始速度之外你還需要什麼,並進行調整以滿足這些要求。