代码之家  ›  专栏  ›  技术社区  ›  Ashley Davis

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

  •  0
  • Ashley Davis  · 技术社区  · 6 年前

    我一直在研究一个使用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 图书馆?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Robin Luiten    6 年前

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

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