首页 > 解决方案 > 运行多个 Nodejs 副本破坏了我的对象数据

问题描述

我有一个包含 javascript 对象的服务,可以说obj。最初,当服务器启动时,对象是空的。我收到 pub sub 消息。每条消息都有两个属性,消息的类型和数据。根据消息的类型,我修改了对象。

例如,如果我收到一个msg-0类型的消息start并收到一些数据abc-0。我将数据添加到我的主要对象中,现在我的对象obj变为{abc-0}.

同样,如果我收到另一条msg-1类型的消息start并收到一些数据abc-1。我将数据添加到我的主要对象中,现在我的对象obj变为{abc-0, abc-1}.

所以想象我收到 10 条这样的消息,那么我的对象obj应该是这样{abc-0, abc-1, abc-2, abc-3, abc-4, abc-5, abc-6, abc-7, abc-8, abc-9, abc-10}的,

如果我只运行该程序的一个副本,那么一切正常。

但是当我运行这个程序的 3 个副本时,我得到的结果是不同的。它创建了 3 个不同的对象,每个对象都包含{abc-0, abc-1, abc-2, abc-3}和。{abc-4, abc-5, abc-6}{abc-7, abc-8, abc-9, abc-10}

我在 kubernetes 上运行 3 个 pod,这个问题变得很明显。而且,当我只运行一个 pod 时,问题就消失了。

我可能做错了什么?这是某种常见的错误吗?

标签: node.js

解决方案


这里的问题是,当运行单独的 NodeJS 实例时,它们是分开的. 他们不共享内存。在一个中声明的对象与其他对象完全分开。为了使其正常工作,进程需要相互通信。我对 Kubernetes 并不完全熟悉,但我假设 pod 相当于 Linux 系统上的进程。如果我错了,请纠正我,但如果是这种情况,那么这将是问题的根源。

我会通过要求每个传入数据块的时间戳来解决这个问题,然后在每个进程中保留对象的完整副本。当新块进入时,根据其时间戳将其放置在正确的位置,并提醒所有其他进程有更新,并可选择共享新块或完整对象。

如果不同的进程(pod)同步运行(一个接一个),那么您需要在该时间点通知对象的下一个进程,以便它可以随着时间的推移继续构建对象。

TL:DR这个问题来自 NodeJS 进程不共享内存。为了解决这个问题,如果进程同时运行,请在所有实例中保留对象的运行日志,并在收到新信息时提醒所有其他实例。如果不是,则在进程实例化时通知对象的下一个进程。

希望我正确理解了这个问题,如果没有,请告诉我。


推荐阅读