我有一个包含javascript对象的服务,比方说obj。最初,当服务器启动时,对象是空的。我收到pub sub消息。每条消息都有两个属性,消息类型和数据。根据消息类型,我修改了对象。
例如,如果我收到一条start类型的消息msg-0,并收到一些数据abc-0。我将数据添加到我的主对象中,现在我的对象obj变成了{abc-0}。
类似地,如果我接收到另一个类型为start的消息msg-1并接收到一些数据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个pods,这个问题变得很明显。而且,当我只运行一个pod时,问题就消失了。
我能做错什么呢?这是一种常见的错误吗?
发布于 2020-05-30 16:25:20
这里的问题是,当运行单独的NodeJS实例时,它们是单独的。它们不共享内存。其中一个声明的对象与其他对象是完全分开的。为了使其正常工作,进程需要相互通信。我对Kubernetes并不完全熟悉,但我假设pod相当于Linux系统上的进程。如果我错了,请纠正我,但如果是这样,那么这将是问题的根源。
我会通过在每个传入数据块上要求时间戳来解决这个问题,然后在每个进程中保留对象的完整副本。当一个新的块进入时,根据它的时间戳将它放在正确的位置,并提醒所有其他进程有更新,并有选择地共享新的块或完整的对象。
如果不同的进程(Pod)同步运行(一个接一个),那么您将需要在该时间点通知对象的下一个进程,以便它可以随着时间的推移继续构建对象。
TL:DR此问题源于NodeJS进程未共享内存。为了解决此问题,如果进程并发运行,请保留所有实例中对象的运行日志,并在收到新信息时向所有其他实例发出警报。如果不是,则在进程实例化时通知对象的下一个进程。
希望我正确理解了这个问题,如果没有,请让我知道。
https://stackoverflow.com/questions/62099665
复制相似问题