编程rookie, 如有错误请指出 ☞:
253065903@qq.com
RabbitMQ
Node.js 客户端( AMQP 0-9-1 V0.5.2
)自动重连
重启策略
开始找解决方案:
通过查看AMQP的源码,发现没有reconnect的选项
然后上GitHub上看有没有人提出类似的问题 github repo
,通过输入 reconnect
搜索issue区找到题为 Support Auto-reconnection
的 issue
,发现这个问题是早在 2013
年就提出来的,可是现在还是 open
的状态!
在这个Issue区发现有一个解决方案还是可以实践一下的:
function connectRMQ() {
amqp.connect(config.rabbitmq.URI).then(function(conn) {
conn.on('close', function() {
console.error('Lost connection to RMQ. Reconnecting in 60 seconds...');
return setTimeout(connectRMQ, 60 * 1000);
});
return conn.createChannel().then(function(ch) {
var ok = ch.assertQueue(config.rabbitmq.queue, {durable: true});
ok = ok.then(function() {
ch.prefetch(1);
ch.consume(config.rabbitmq.queue, doWork, {noAck: false});
});
return ok.then(function() {
console.log(" [*] Waiting in %s.", config.rabbitmq.queue);
});
function doWork(msg) {
var body = msg.content.toString();
console.log(" [x] Received %s", body);
setTimeout(function() {
ch.ack(msg);
}, config.rabbitmq.timeout);
}
});
}).then(null, function() {
setTimeout(connectRMQ, 10 * 1000);
return console.log('connection failed');
});
}
connectRMQ();
上述的解决方案是在建立连接之后对连接添加 close
的监听事件,当 close
事件触发,
或者连接出错以及之后的步骤出错都在10s之后重新调用方法本身实现重连
还有一种简单粗暴的方法,监听 close
、 error
事件, 有错误就抛出来,然后依靠外部的守护程序将此客户端重启
实践
按照Issue区发现的解决方案进行实践,修改之前的代码
#