ETIMEDOUT与node.js&amqp的问题

我有两个生产者和两个消费者在我的项目中使用rabbitmq通过node.js中的amqp模块。

为消费者build立连接的代码如下所示:

function init_consumers( ) { console.log( 'mq: consumers connection established. Starting to init stuff..' ); global.queue.consumers.connection = con_c; var fq_name = global.queue.fq_name; var aq_name = global.queue.aq_name; var q_opts = { durable:true }; var subscr_opt = { ack: true, prefetchCount: 1 }; var fq = con_c.queue( fq_name, q_opts, function() { console.log( 'mq: consumer f queue prepared. '); global.queue.consumers.fq = fq; fq.subscribe( subscr_opt, function(msg) { global.controllers.fc.ParseF( msg, function() { global.queue.consumers.fq.shift(); } ); }); }); var aq = con_c.queue( aq_name, q_opts, function() { console.log( 'mq: consumer a queue prepared. '); global.queue.consumers.aq = aq; aq.subscribe( subscr_opt, function(msg) { global.controllers.fc.ParseAndSaveToDB( msg, function() { global.queue.consumers.aq.shift(); } ); }); }); } // connect and init var con_c = amqp.createConnection( { url: global.queue.consumers.host }, global.queue.con_extra_options ); con_c.on( 'ready', init_consumers ); con_c.on( 'error', function(e) { console.log( 'consumer error', e ); con_c.end(); if( typeof global.queue.consumers.connection !== 'undefined' ) { global.queue.consumers.connection.end(); } }); 

连接额外的选项是:

 con_extra_options: { reconnect: true, // Enable reconnection reconnectBackoffStrategy: 'linear', reconnectBackoffTime: 5000, // Try reconnect 5 seconds }, 

在rabbitmqpipe理控制台启动项目后,我清楚地看到有两个通道build立了一个连接。 很好。

然后,它工作得很好,直到发生错误(可能与某些断开连接有关),在控制台中给我这个输出:

 consumer error { [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' } 

问题是,当这个错误发生时,amqp尝试重新连接到队列服务器,但似乎即使我的代码上面的连接仍然打开。 结果经过几个小时的工作,我有10个连接,打开了50个通道,唯一剩下的就是重启项目。

所以,我有两个问题:

  1. 为什么会出现这种错误?
  2. 我应该做些什么修改来阻止连接和通道随着时间的增长?

将此添加到您的url参数

心跳= 5

这将发送心跳到AMQP服务器,让它知道你的代码还活着(你可以设置其他东西,除了零)