Py学习  »  MQ

node.js微服务应该如何在rabbitmq重新启动后存活?

Ashley Davis • 5 年前 • 510 次点击  

我一直在研究一个使用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 for development和kubernetes for production。我可以设置它,以便微服务在与rabbitmq断开连接时重新启动,但如果微服务可以保持在线(它们可能正在执行其他不应中断的工作),然后在重新可用时自动重新连接到rabbitmq,我更愿意这样做。

任何人都知道如何使用 ampq 图书馆?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30879
 
510 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Robin Luiten
Reply   •   1 楼
Robin Luiten    5 年前

只是选取发送者服务作为如何处理它的示例。 导致节点退出的错误是,编写器用户流上没有“错误”处理程序。

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