2014-02-07 41 views
2

我有2個生產者和兩個消費者在我的項目中使用rabbitmq通過node.js中的amqp模塊。ETIMEDOUT問題與node.js&amqp

建立消費者連接的代碼看起來是這樣的:

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(); } 
}); 

連接額外的選項有:項目已在RabbitMQ的管理控制檯啓動

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

之後,我清楚地看到,有1個連接建立了2個頻道。很好。

然後,它工作得很好,直到一個錯誤(可能涉及到一些沒有斷線)發生,給我這個產量在控制檯:

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

的問題是,當這個錯誤發生,AMQP嘗試重新連接到隊列服務器,但似乎即使我的代碼上面的連接仍然打開。經過幾個小時的工作,我有10個連接,打開了50個頻道,唯一剩下的就是重啓項目。

所以,我有兩個問題:

  1. 爲什麼會出現這樣那樣的錯誤?
  2. 我應該實施哪些修改來阻止連接和通道隨着時間的增長?

回答

1

添加到您的URL參數

心跳= 5

這將發送心跳AMQP服務器,讓它知道你的代碼仍然活着 (可以設置爲除零之外的東西)