我正在运行一个包含2个RabbitMQ服务器的集群(可以是任意数字),我已经实现了故障转移,其中我的应用程序循环RabbitMQ列表并尝试在连接断开时重新连接。
如果我正在尝试连接的RabbitMQ实例已关闭,则在尝试下一个实例时需要大约60秒才能超时,这是很长时间。有没有办法配置超时或其他一些方法,使其更快失败。这导致不必要的长停机时间。心跳负责检测现有连接的故障,但问题是初始连接尝试。
以下是我用于连接的代码:
connect(callback) {
const self = this;
amqp.connect(rabbitInstances[rabbitInstance] + "?heartbeat=10").then(conn => {
conn.on("error", function(err) {
setTimeout(() => self.reconnect(callback), 5000));
return;
});
conn.on("close", function() {
setTimeout(() => self.reconnect(callback), 5000));
return;
});
connection = conn;
whenConnected(callback);
})
.catch(err => {
setTimeout(() => self.reconnect(callback), 5000));
});
}
reconnect(callback) {
this.rabbitInstance === (rabbitInstances.length - 1) ? this.rabbitInstance = 0 : this.rabbitInstance++;
this.connect(callback)
}
答案 0 :(得分:2)
我阅读了amqplib
的源代码,看到connect
的第二个参数接受了一个包含普通套接字选项的对象。我用它来强加并验证2秒钟的超时,如下所示:
const amqp = require('amqplib');
const connection = await amqp.connect('amqp://localhost', {
timeout: 2000,
servername: 'localhost',
});
我正在使用amqplib
的0.5.3版本。 Github URL在这里:https://github.com/squaremo/amqp.node。