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個頻道,唯一剩下的就是重啓項目。
所以,我有兩個問題:
- 爲什麼會出現這樣那樣的錯誤?
- 我應該實施哪些修改來阻止連接和通道隨着時間的增長?