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

时间:2019-02-01 01:50:30

标签: 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服务器的发送方和接收方微服务。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您修改了代码的这一部分。 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