【问题标题】:Node.js Cluster to Process Data as Often As PossibleNode.js 集群尽可能频繁地处理数据
【发布时间】:2018-05-30 01:32:47
【问题描述】:

请耐心等待,因为我对集群完全陌生,文档并没有点击我。

if (cluster.isMaster)
{
  for (let i = 0; i < numCPUs; i++)
  {
    cluster.fork();
  }

  for (const file in files)
  {
    cluster.workers.send(file); //***
  }
}
else if (cluster.isWorker) 
{
  process.on("message", (msg) => 
  {
    //...Process data here...
  });
}

*** 是我想要的那种东西。像 cluster.workers.send(...) 这样的东西会向工作人员发送消息,不忙的人会收到消息。如果所有工作人员都忙,则消息将等待发送,直到有空闲工作人员。

【问题讨论】:

  • 节点集群将创建您的应用程序的多个实例。如果您只想让一个集群执行一项任务,您可以使用 redis 和 redlock npm 模块。使用此模块,您可以只允许一个集群在多个集群中执行一项任务。
  • 我会检查 redis 和 redlock,但是有没有一种方法可以在不添加额外依赖项的情况下实现这一点?如果可能的话,最好不要太多样板

标签: javascript node.js sockets pm2


【解决方案1】:

如果你有大量的任务,你需要一个数据库来管理队列,正如Vinay Pandya 所建议的那样,redis 将是一个不错的选择。

你想防止额外的依赖,你可以在集群主进程中使用一个队列数组,并将任务推入/移出该数组。要确定空闲节点,您可以维护一个“节点”对象,并在完成其任务以更新它时从每个节点获得反馈。可以通过process.send 进行反馈。

【讨论】:

  • 是的,你是对的,但我建议你应该使用 redis 而不是内存对象,因为如果你重新启动应用程序,所有的对象都会消失。所以对于 Redis 来说,Redis 的速度非常快,就像缓存内存一样。
  • 当然。对一个非常好的解决方案有一点依赖并没有什么坏处:)
  • 所以我想我得到了我所期望的,没有像 Bulent Vural 建议的那样通过侦听器和 process.send 使用 redis,但是我意识到集群使用的内存比我能够负担的要多得多任务。你们中的任何一个人都知道使用 Redis 进行集群是否会节省内存?理想情况下,如果我有 10 GB 的 JSON,我想将其存储为 10 GB 而不是 10 GB x(我认为现在正在发生的分叉进程数)。换句话说,我的所有进程都可以共享一个 Redis 实例吗?非常感谢。
  • "stackabuse.com/setting-up-a-node-js-cluster" 说了一些我觉得很有趣的话,“需要说明的是,Node 中的分叉与 POISIX 分叉非常不同,因为它实际上并没有克隆当前进程,但它确实开始了启动一个新的 V8 实例。”我想我会打开一个单独的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多