2011-09-21 26 views
9

tôi đã viết một thử nghiệm nhỏ cho một kịch bản đơn giản:Redis/RabbitMQ - Pub/Sub - Biểu diễn

Một nhà xuất bản và một thuê bao

Nhà xuất bản gửi 1000000 điệp

Subscriber nhận được 1000000 thông điệp

Thử nghiệm đầu tiên với RabbitMQ, trao đổi fanout, RabbitMq loại nút Ram: 320 giây

Thử nghiệm thứ hai với Redis, p cơ bản ub/Sub: 24 giây

Tôi có thiếu gì đó không? Tại sao lại có sự khác biệt như vậy? Đây có phải là vấn đề về cấu hình hay không?

Kịch bản đầu tiên: một quy trình node.js cho người đăng ký, một cho nhà xuất bản, mỗi người, một kết nối với thỏmq với mô-đun nút amqp. Scénario thứ hai: một quá trình node.js cho người đăng ký, một cho nhà xuất bản, mỗi người có một kết nối với redis.

Mọi trợ giúp đều được chào đón để hiểu ... Tôi có thể chia sẻ mã nếu cần.

Tôi khá mới đối với tất cả điều này. Những gì tôi cần, là một hệ thống tin nhắn pub/sub biểu diễn cao. Tôi muốn có khả năng phân cụm.

Để chạy thử nghiệm của tôi, tôi chỉ cần khởi động máy chủ RabbitMQ (cấu hình mặc định) và tôi sử dụng như sau

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

Bạn đã tìm thấy câu trả lời cho điều này chưa? –

Trả lời

22

Kiểm tra để đảm bảo rằng:

  • hàng đợi RabbitMQ của bạn không được cấu hình như dai dẳng (vì đó sẽ yêu cầu đĩa ghi cho mỗi tin nhắn)
  • đếm prefetch của bạn ở phía thuê bao là 0
  • Bạn không sử dụng các giao dịch hoặc nhà xuất bản khẳng định

Có là những thứ khác có thể được điều chỉnh, nhưng không biết chi tiết về thử nghiệm của bạn khó đoán. Tôi chỉ đảm bảo rằng bạn đang so sánh "táo với táo".

Hầu hết các sản phẩm nhắn tin có thể được thực hiện nhanh nhất có thể bằng cách đảm bảo các đảm bảo khác nhau (như đảm bảo phân phối, v.v.) để đảm bảo bạn hiểu các yêu cầu của ứng dụng trước. Nếu yêu cầu duy nhất của bạn là cho dữ liệu được xẻng từ điểm A đến điểm B và bạn có thể chịu đựng sự mất mát của một số tin nhắn, thì hầu hết mọi hệ thống nhắn tin đều có thể làm điều đó và thực hiện tốt. Phần khó khăn hơn là tìm ra những gì bạn cần ngoài tốc độ thô, và điều chỉnh để đáp ứng các yêu cầu đó.

Các vấn đề liên quan