Redis / RabbitMQ - Pub / Sub - 表演

时间:2011-09-21 19:07:50

标签: performance redis rabbitmq publish-subscribe

我为一个简单的场景写了一个小测试:

一个发布商和一个订阅者

Publisher发送1000000条消息

订阅者收到1000000条消息

首次使用RabbitMQ测试,扇出Exchange,RabbitMq节点类型Ram:320秒

使用Redis进行第二次测试,基本发布/次级:24秒

我错过了什么吗?为何如此差异?这是配置问题还是什么?

第一种情况:订阅者的一个node.js进程,发布者的一个进程,每个进程,一个连接到带有amqp节点模块的rabbitmq。 第二个scénario:订阅者的一个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:guest@localhost: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:guest@localhost: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);
            }
        });
    });
});

1 个答案:

答案 0 :(得分:22)

检查以确保:

  • 您的RabbitMQ队列未配置为持久性(因为这需要为每条消息写入磁盘)
  • 订阅方的预取计数为0
  • 您未使用交易或发布商确认

还有其他一些可以调整的东西,但是如果不知道测试的细节,就很难猜到。我只想确保你比较“苹果与苹果”。

大多数消息传递产品可以尽可能快地以牺牲各种保证(如交付保证等)为代价,因此请确保首先了解您的应用程序的要求。如果您的唯一要求是将数据从A点推到B点,并且您可以容忍丢失某些消息,那么几乎每个消息传递系统都可以做到这一点,并且做得很好。更难的部分是确定除了原始速度之外你需要什么,并调整以满足这些要求。