有关node.js&amqp的ETIMEDOUT问题

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

用于为消费者建立连接的代码如下所示:

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
                    },

项目在rabbitmq管理控制台中启动后,我清楚地看到有两个通道建立了1个连接。 很好。

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

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

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

所以,我有两个问题:

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

  • 将此添加到您的url参数

    心跳= 5

    这会将心跳发送到AMQP服务器,让它知道你的代码仍然存在(你可以设置为除零之外的其他内容)

    链接地址: http://www.djcxy.com/p/34171.html

    上一篇: ETIMEDOUT problems with node.js & amqp

    下一篇: How to configure RabbitMQ using Active/Passive High Availability architecture