Node.js 与 RabbitMQ 的连接
Node.js connection with RabbitMQ
我有一个 node.js
应用程序,它使用 amqlib
连接 RabbitMQ。
我正在尝试使用 RabbitMQ 重现连接错误,但我通过重复相同的流程得到了两个不同的错误。
我正在做的是:
- 使用 RabbitMQ 管理启动一个 Docker 容器。
- 启动连接到 RabbitMQ 的 node.js 应用程序(docker 或使用 npm)。
- 继续 RabbitMQ 管理并使用
rabbitmqctl
执行 stop_app
此流程每次都会产生以下两个异常之一(不确定它如何决定每个异常):
- 操作错误:connect 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;
}
ECONNREFUSED 表示应用程序无法连接到 docker 容器内的 RabbitMQ。
心跳错误表示连接建立成功,但是客户端已经停止接收来自broker的心跳,说明连接已经丢失。
您可能还会收到另一种类型的通知。如果您已经开始使用来自应用程序的消息,当您停止代理时,amqplib 将向消费者发送 null
消息。如果您没有预料到这一点,它通常会导致您的应用程序出错。
处理这些不同的场景可能很困难。最简单的方法是将处理程序附加到所有连接和通道,然后优雅地停止您的应用程序,并允许管理它的任何东西使用合适的退避算法自动重新启动。
如果这是不可接受的,那么您需要重新连接并从处理程序中重新使用。您可能还希望在内部对发布的消息进行排队,直到重新建立连接。我写了 Rascal to do just this. There's also amqp-connection-manager.
您可以考虑用来测试的其他东西...
- docker kill(粗鲁地终止连接)
- docker暂停(会导致心跳超时)
- 队列删除(我相信这会触发空消息)
我有一个 node.js
应用程序,它使用 amqlib
连接 RabbitMQ。
我正在尝试使用 RabbitMQ 重现连接错误,但我通过重复相同的流程得到了两个不同的错误。
我正在做的是:
- 使用 RabbitMQ 管理启动一个 Docker 容器。
- 启动连接到 RabbitMQ 的 node.js 应用程序(docker 或使用 npm)。
- 继续 RabbitMQ 管理并使用
rabbitmqctl
执行stop_app
此流程每次都会产生以下两个异常之一(不确定它如何决定每个异常):
- 操作错误:connect 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;
}
ECONNREFUSED 表示应用程序无法连接到 docker 容器内的 RabbitMQ。
心跳错误表示连接建立成功,但是客户端已经停止接收来自broker的心跳,说明连接已经丢失。
您可能还会收到另一种类型的通知。如果您已经开始使用来自应用程序的消息,当您停止代理时,amqplib 将向消费者发送 null
消息。如果您没有预料到这一点,它通常会导致您的应用程序出错。
处理这些不同的场景可能很困难。最简单的方法是将处理程序附加到所有连接和通道,然后优雅地停止您的应用程序,并允许管理它的任何东西使用合适的退避算法自动重新启动。
如果这是不可接受的,那么您需要重新连接并从处理程序中重新使用。您可能还希望在内部对发布的消息进行排队,直到重新建立连接。我写了 Rascal to do just this. There's also amqp-connection-manager.
您可以考虑用来测试的其他东西...
- docker kill(粗鲁地终止连接)
- docker暂停(会导致心跳超时)
- 队列删除(我相信这会触发空消息)