+-
与RabbitMQ的Node.js连接

我有一个 node.js 应用程序,使用 amqlib 我试图重现与RabbitMQ的连接错误,但通过重复相同的流程,我得到了两个不同的错误。

我正在做的是

启动一个Docker容器和RabbitMQ管理。 启动一个在RabbitMQ上连接的node.js应用程序(无论是docker还是用npm)。 在RabbitMQ管理上,用 rabbitmqctl 执行 stop_app

这个流程每次都会产生以下两个异常之一(不知道它是如何决定每个异常的)。

OperationalError: 连接ECONNREFUSED 连接ECONNREFUSED 172.24.0.3:5672 错误,心跳超时。 心跳超时

为什么会出现这种情况?另外,处理它们的最佳方法是什么?

这是我在连接器上的连接函数,似乎没有覆盖心跳异常。

  async connect(): Promise<Connection> {
    const conn = await amqp.connect({
      protocol: AMQP_PROTOCOL,
      hostname: RABBITMQ_HOST,
      port: Number(RABBITMQ_PORT),
      username: RABBITMQ_USER,
      password: RABBITMQ_PASS,
      vhost: RABBITMQ_VHOST
    });

    conn.on('error', this.onError);
    conn.on('close', this.onClose);

    logger.debug('Connected to amqp');

    this.conn = conn;
    this.emit('connect', conn);

    return conn;
  }
1
投票

ECONNREFUSED表示应用程序无法连接到docker容器内的RabbitMQ。

心跳错误表示连接成功建立,但客户端已经停止接收来自broker的心跳,表明连接已经丢失。

还有一种类型的通知你可能会收到。如果你已经开始消耗来自你的应用程序的消息,当你停止broker时,amqplib会提供一个 null 信息给消费者。如果你没有料到这一点,往往会导致你的应用程序出现错误。

处理这些不同的场景可能很困难。最简单的方法是将处理程序附加到所有的连接和通道上,然后优雅地停止你的应用程序,并允许管理它的任何东西使用合适的后退算法自动重新启动。

如果这还不能接受,那么你需要重新连接并从处理程序中重新消耗。你可能还想在内部排队发布的消息,直到连接被重新建立。我写了 无赖 来做到这一点。还有 amqp-connection-manager.

其他的事情,你可以考虑使用测试...

docker kill (粗暴地杀死连接) docker暂停(会导致心跳超时 队列删除(我相信这会触发一个空消息