Redis / RabbitMQ - Pub / Sub - Выступления - PullRequest
9 голосов
/ 21 сентября 2011

Я написал небольшой тест для простого сценария:

Один издатель и один подписчик

Издатель отправляет 1000000 сообщений

Абонент получает 1000000 сообщений

Первый тест с RabbitMQ, разветвление Exchange, тип узла RabbitMq Ram: 320 секунд

Второй тест с Redis, основной паб / саб: 24 секунды

Я что-то упустил? Почему такая разница? Это проблема конфигурации или что-то в этом роде?

Первый сценарий: один процесс node.js для подписчика, один для издателя, каждый, одно соединение с rabbitmq с модулем узла amqp. Второй сценарий: один процесс 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 Ответ

22 голосов
/ 25 сентября 2011

Убедитесь, что:

  • Ваша очередь RabbitMQ не настроена как постоянная (поскольку для этого потребуется запись на диск для каждого сообщения)
  • Количество предварительных выборок на стороне подписчика составляет 0
  • Вы не используете транзакции или издатель подтверждает

Есть и другие вещи, которые можно настроить, но, не зная деталей вашего теста, трудно догадаться. Я бы просто убедился, что вы сравниваете "яблоки с яблоками".

Большинство продуктов для обмена сообщениями можно сделать максимально быстрыми, за счет различных гарантий (таких как обеспечение доставки и т. Д.), Поэтому сначала убедитесь, что вы понимаете требования своего приложения. Если ваше единственное требование - переместить данные из точки А в точку Б, и вы можете допустить потерю некоторых сообщений, почти каждая система обмена сообщениями может это сделать и делать это хорошо. Сложнее всего выяснить, что вам нужно, помимо необработанной скорости, и настроить, чтобы соответствовать этим требованиям.

...