【问题标题】:Configuring socket timeout on amqplib connect在 amqplib 连接上配置套接字超时
【发布时间】:2017-10-15 05:11:08
【问题描述】:

我正在运行一个由 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)
}

【问题讨论】:

  • 你解决了吗?
  • 不,我还没有找到解决方案。如果我发现了什么,我会在这里发布。不过,我目前正在做其他事情,所以这不是我正在积极关注的事情。

标签: node.js rabbitmq amqp node-amqplib


【解决方案1】:

我阅读了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

【讨论】:

  • 太棒了!几年来一直没有使用 amqplib,但似乎这已经在不久前添加到套接字选项中:link to PR。它只是从文档中丢失。感谢您解决这个问题!
  • 任何人回到这个答案,超时只是握手超时,而不是连接超时。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2017-03-17
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多