Ovr*_*vrz 9 performance publish-subscribe rabbitmq redis
我为一个简单的场景写了一个小测试:
一个发布者和一个订阅者
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);
            }
        });
    });
});
Bri*_*lly 22
检查以确保:
还有其他事情可以调整,但不知道测试的细节,很难猜测.我只想确保你比较"苹果与苹果".
大多数消息传递产品可以尽可能快地以牺牲各种保证(如交付保证等)为代价,因此请确保首先了解应用程序的要求.如果您的唯一要求是将数据从A点推到B点,并且您可以容忍丢失某些消息,那么几乎每个消息传递系统都可以做到这一点,并且做得很好.更难的部分是确定除了原始速度之外你需要什么,并调整以满足这些要求.