如何在不丢失数据的情况下更新nodejs应用

时间:2020-10-20 13:16:29

标签: javascript node.js pm2

我有一个nodejs数据应用程序,它从远程api收集数据,大约需要一个星期才能获得完整的当前数据集。

数据通过网络套接字到达,每隔几毫秒数据包到达一次。 处理完这些数据后,即可通过应用程序中的Websocket服务器使用它。

如果我现在需要更新该应用程序,它将关闭一周,因为如上所述,它首先需要重新创建数据集。

为了减轻这种情况,我尝试使用PM2启动该应用程序的2个实例,每个服务器侦听不同的端口,并且在更新之前,关闭的端口将向其客户端发送一条消息,告知他们客户端应开始侦听其他端口端口。

但是,当客户端更改端口时,我收到一条404消息,说明握手有问题。如果我尝试使用任一端口,而只有一个服务器应用程序单独运行,则每个端口都可以工作。

另外,如果我尝试连接到第二个端口-不先连接到第一个端口-如果我有两个正在运行的服务器应用程序,则第二个端口也将提供404。

我该如何解决这个问题。

服务器代码:

// create a websocket server listening on port PORT
let server = app.listen(
  PORT,
  console.log(
    `Websocket server running in ${process.env.NODE_ENV} mode on port ${PORT}`
  )
);
server.on("error", () => {
  server = app.listen(
    PORT_2ND,
    console.log(
      `Websocket server running in ${process.env.NODE_ENV} mode on port ${PORT_2ND}`
    )
  );
});

客户端:

async initWs(port = 3010) {
      const ws = new ReconnectingWebSocket(`ws://xxx.kk:${port}`);

  ws.onmessage = e => {
    let data = JSON.parse(e.data);
    this.handleMessage(data);
  };

//...
}

async handleMessage(data){
  if (data.method === "stop") {
    const port = this.currentWSPort === 3000 ? 3010 : 3000;
    ws.close();
    await this.delay(500);
    initWs(port);
}

The error message

0 个答案:

没有答案