【问题标题】:Node.js connection with RabbitMQNode.js 与 RabbitMQ 的连接
【发布时间】:2020-03-24 12:10:14
【问题描述】:

我有一个node.js 应用程序,它使用amqlib 连接RabbitMQ。 我正在尝试使用 RabbitMQ 重现连接错误,并且通过重复相同的流程得到两个不同的错误。

我正在做的是:

  • 使用 RabbitMQ 管理启动 Docker 容器。
  • 启动连接到 RabbitMQ 的 node.js 应用程序(docker 或使用 npm)。
  • 继续 RabbitMQ 管理并使用rabbitmqctl 执行stop_app

此流程每次都会产生以下两个异常之一(不确定它如何决定每个异常):

  • 操作错误:连接 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;
  }

【问题讨论】:

    标签: node.js docker rabbitmq amqp node-amqp


    【解决方案1】:

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

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

    您可能还会收到另一种类型的通知。如果您已经开始从您的应用程序消费消息,当您停止代理时,amqplib 将向消费者传递一个null 消息。如果您没有预料到,这通常会导致您的应用程序出错。

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

    如果这是不可接受的,那么您需要重新连接并从处理程序重新使用。您可能还希望在内部对已发布的消息进行排队,直到重新建立连接。我写了Rascal 就是为了做到这一点。还有amqp-connection-manager

    您可以考虑用于测试的其他东西...

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

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 2020-02-28
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多