Задержка сообщения RabbitMQ между производителем и потребителем

Я запускаю клиент node.js amqp-node на сервере RabbitMQ. Я настроил простой тест публикации / потребления двумя разными способами - каждый дает разную задержку, и я не могу понять, почему. Задержка измеряется с момента отправки сообщения до момента его доставки.

Первый метод использует два отдельных процесса: один для публикующего приложения, а второй - для приложения-потребителя. Это дает задержку около 4 мс. Второй метод использует только одно приложение для производства и потребления. Это дает задержку около 40 мс. Может ли кто-нибудь объяснить мне такое поведение, почему? Спасибо за уделенное время.

Метод №1 Производитель:

var amqp = require('amqp'),
    connection = amqp.createConnection({host:'localhost'}),
    testExchange = {};

connection.on('ready', function(){
    testExchange = connection.exchange('testExchange', {type:'topic', autoDelete:true});
    testMessage();
});

function testMessage(){
    console.log('message sent');
    testExchange.publish('test.message', { msg:'testMessage', time: new Date().getTime() });
    setTimeout(testMessage, 500);
}

Метод №1 для потребителей

var amqp = require('amqp'),
    connection = amqp.createConnection({host:'localhost'}),

connection.on('ready', function(){
    var testExchange = connection.exchange('testExchange', {type:'topic', autoDelete:true});
    var testQ = connection.queue('testQ', function(queue){
        queue.bind('testExchange', 'test.#');
        queue.subscribe( function(message){
            console.log('message received');
            var now = new Date().getTime();
            console.log(now-message.time);
        });
    });
});

Метод № 2: производитель и потребитель

var amqp = require('amqp'),
    connection = amqp.createConnection({host:'localhost'}),
    testExchange = {};

connection.on('ready', function(){
    testExchange = connection.exchange('testExchange', {type:'topic', autoDelete:true});
    var testQ = connection.queue('testQ', function(queue){
        queue.bind('testExchange', 'test.#');
        queue.subscribe( function(message){
            console.log('message received');
            var now = new Date().getTime();
            console.log(now-message.time);
        });
        testMessage();
    });
});

function testMessage(){
    console.log('message sent');
    testExchange.publish('test.message', { msg:'testMessage', time: new Date().getTime() });
    setTimeout(testMessage, 500);
}

person RobotEyes    schedule 16.08.2012    source источник


Ответы (1)


В первом методе у вас есть два независимых подключения к серверу RabbitMQ, где, как и во втором методе, вы используете одно и то же соединение для производителя (отправителя) и потребителя (получателя). По общему признанию, ваша скорость сообщений 2 в секунду довольно низкая, учитывая локальный сервер RabbitMQ, поэтому мы можем не учитывать любые сетевые задержки, но я подозреваю, что RabbitMQ или реализация amqp node.js замедляет работу, когда отправители и получатели мультиплексируются в одном и том же соединении.

Ваше здоровье!

person Sachin    schedule 17.08.2012