node.js - Node.js微服务应如何在Rabbitmq重新启动后生存下来?

标签 node.js docker docker-compose rabbitmq microservices

我一直在研究使用Rabbitmq在Node.js微服务之间进行通信的示例,并且我试图了解使这些微服务在Rabbitmq服务器重启后仍能生存的最佳方法。

完整的示例在Github上可用:https://github.com/ashleydavis/rabbit-messaging-example

您可以通过更改到广播子目录并使用docker-compose up --build来启动系统。

运行该命令后,我将打开另一个终端并发出以下命令以终止Rabbit服务器docker-compose kill rabbit

这会导致Node.js未处理的异常杀死我连接到Rabbitmq服务器的发送方和接收方微服务。

现在,我希望能够重新启动Rabbitmq服务器(使用docker-compose up rabbit)并使原始微服务重新联机。

它旨在在Docker-Compose下进行开发,在Kubernetes下进行生产。我可以进行设置,以使微服务在通过与Rabbitmq断开连接而终止时重新启动,但是如果微服务可以保持在线状态(它们可能正在做其他不应中断的工作)然后重新连接,则我更愿意这样做。到Rabbitmq再次可用时自动运行。

有人知道如何使用ampq库实现与Rabbitmq的自动重新连接吗?

最佳答案

仅以发送者服务为例说明如何处理它。
导致节点退出的错误是,在编写者用户的流上没有“错误”处理程序。

如果您修改了这部分代码。
https://github.com/ashleydavis/rabbit-messaging-example/blob/master/broadcast/sender/src/index.js#L13

从以下位置更改sender / src / index.js中的行

const messagingConnection = await retry(() => amqp.connect(messagingHost), 10, 5000);



const messagingConnection = await retry(() => amqp.connect(messagingHost), 10, 5000)
    .then(x => {
        return x.on('error', (err) => {
            console.log('connect stream on error', err)
        });
    });

仅具有错误处理程序意味着节点进程不再存在未处理的异常。这不能使发送方代码正确,现在需要对其进行修改以了解其是否具有连接,仅在具有连接时才发送数据,而在没有连接时重试连接。

可以对接收器应用类似的修复程序

当节点要求安装程序不退出时,这是一个有用的引用。
https://medium.com/dailyjs/how-to-prevent-your-node-js-process-from-crashing-5d40247b8ab2

关于node.js - Node.js微服务应如何在Rabbitmq重新启动后生存下来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471798/

相关文章:

docker - 了解 docker - 容器如何包含所有必需的依赖项?

docker - 从 docker compose YAML 文件创建两个 influxdb

docker - mem_limit 没有被 docker-compose 兑现?

javascript - 使用 JWT 授权从 express node.js 下载文件

docker - 附加到Docker容器运行过程后如何打印命令行参数?

node.js - ETXTBSY : text file is busy when running npm install (via Vagrant with Unix - Desktop OS is Windows)

docker - 有没有办法抹平Dockerfile?

django - 在 Docker 中持久化 Django 的 PostgreSQL 数据库

node.js - 在生产中禁用 EJS 缓存

node.js - NX : Copy one extra file to build directory