生产者和消费者之间的RabbitMQ消息延迟

问题描述:

我在RabbitMQ服务器上运行node.js amqp-node客户端。我已经以两种不同的方式建立了一个简单的发布/消费测试 - 每个测试都会产生不同的延迟,我无法弄清楚原因。等待时间是从消息发送到交付时的时间来衡量的。生产者和消费者之间的RabbitMQ消息延迟

第一种方法使用两个单独的进程 - 一个用于发布应用程序 - 一个用于消费应用程序。它产生约4ms的延迟。第二种方法只使用一个应用程序来制作和使用。这产生了约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); 
} 

在第一种方法中,您有两个与RabbitMQ服务器的独立连接,在第二种方法中,您为生产者(发送者)和消费者(接收者)共享相同的连接。无可否认,由于本地主机RabbitMQ服务器的信息速率很低,因此我们可以减少任何网络延迟,但是我怀疑RabbitMQ或node.js amqp实现会减慢发送者和接收者在同一连接上进行多路复用时的速度。

干杯!