2011-09-21 11 views
9

मैं एक साधारण परिदृश्य के लिए एक छोटे से परीक्षण लिखा है:Redis/RabbitMQ - - पब/उप प्रदर्शन

एक प्रकाशक और एक ग्राहक

प्रकाशक 1000000 संदेशों

सब्सक्राइबर 1000000 संदेश प्राप्त भेज

खरगोश एमक्यू, प्रशंसक एक्सचेंज, रैबिटएमक नोड प्रकार राम के साथ पहला परीक्षण राम: 320 सेकंड

रेडिस, मूल पी के साथ दूसरा परीक्षण ub/उप: 24 सेकंड

क्या मुझे कुछ याद आ रही है? ऐसा कोई अंतर क्यों है? क्या यह एक विन्यास समस्या है या कुछ?

पहला परिदृश्य: ग्राहक के लिए एक node.js प्रक्रिया, प्रकाशक के लिए एक, प्रत्येक एक, amqp नोड मॉड्यूल के साथ rabbitmq के लिए एक कनेक्शन। दूसरा स्कैनारियो: ग्राहक के लिए एक node.js प्रक्रिया, प्रकाशक के लिए एक, प्रत्येक को रेडिस के लिए एक कनेक्शन मिला।

किसी भी मदद को समझने का स्वागत है ... यदि आवश्यक हो तो मैं कोड साझा कर सकता हूं।

मैं इन सब के लिए बिल्कुल नया हूं। मुझे क्या चाहिए, एक उच्च प्रदर्शन पब/उप संदेश प्रणाली है। मैं क्लस्टरिंग क्षमताओं को देखना चाहता हूं।

अपने परीक्षण चलाने के लिए, मैं सिर्फ 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
  • आप लेन-देन या प्रकाशक उपयोग नहीं कर रहे है इस बात की पुष्टि

वहाँ अन्य चीजें हैं जिन्हें ट्यून किया जा सकता है, लेकिन आपके परीक्षण के विवरण जानने के बिना अनुमान लगाना मुश्किल है। मैं बस यह सुनिश्चित करूँगा कि आप "सेब से सेब" की तुलना कर रहे हैं।

अधिकांश संदेश उत्पादों को विभिन्न गारंटी (जैसे डिलीवरी आश्वासन, आदि) के खर्च पर मानव रूप से संभव के रूप में तेजी से जाने के लिए बनाया जा सकता है, इसलिए सुनिश्चित करें कि आप पहले अपने आवेदन की आवश्यकताओं को समझें। यदि आपकी एकमात्र आवश्यकता डेटा ए से बिंदु बी से घूमने के लिए है और आप कुछ संदेशों के नुकसान को सहन कर सकते हैं, तो वहां से प्रत्येक संदेश प्रणाली बहुत कुछ कर सकती है, और इसे अच्छी तरह से कर सकती है। कठिन हिस्सा यह पता लगा रहा है कि आपको कच्ची गति से परे क्या चाहिए, और उन आवश्यकताओं को पूरा करने के लिए ट्यूनिंग भी।