2011-09-21 11 views
9

私は単純なシナリオのために少しテストを書いた:のRedis/RabbitMQの - パブ/サブ - 演劇

一つのパブリッシャとのサブスクライバ

Publisherは1000000のメッセージ

を送信する加入者が1000000のメッセージ

を受け取ります

RabbitMQ、ファンアウトエクスチェンジ、RabbitMqノードタイプのラム:320秒で最初のテスト

Redisの2番目のテスト、基本的なp ub /サブ:24​​秒

私に何か不足していますか?なぜそのような違いがありますか?これは設定上の問題なのでしょうか?

最初のシナリオ:サブスクライバ用に1つのnode.jsプロセス、1つはパブリッシャ用、もう1つはamqpノードモジュールを使用したrabbitmqへの接続です。 第2のシナリオ:サブスクライバのための1つのnode.jsプロセス、1つは発行者用、もう1つはredisへの接続です。

私は必要に応じてコードを共有することができます。

私はこのすべてにかなり新しいです。 私が必要とするのは、高性能pub/subメッセージングシステムです。私はクラスタリング機能を持っていたいと思います。

私のテストを実行するには、私だけの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にシャベルされ、いくつかのメッセージの損失を許容することができれば、そこにあるほとんどすべてのメッセージングシステムがそれを行い、うまくいくことです。難しい部分は、あなたが生のスピードを超えて必要なものを見つけ出し、それらの要件を満たすために調整することです。

関連する問題