Javascript node js群集在所有8个进程上重复相同的任务

Javascript node js群集在所有8个进程上重复相同的任务,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我一直在尝试在我的NodeJS应用程序中启用集群。目前,我使用此代码段来启用它: var cluster = require('cluster'); if (cluster.isMaster) { // Count the machine's CPUs var cpuCount = require('os').cpus().length; // Create a worker for each CPU for (var i = 0; i < cpuCount; i +=

我一直在尝试在我的NodeJS应用程序中启用集群。目前,我使用此代码段来启用它:

var cluster = require('cluster');

if (cluster.isMaster) {
  // Count the machine's CPUs
  var cpuCount = require('os').cpus().length;

  // Create a worker for each CPU
  for (var i = 0; i < cpuCount; i += 1) {
    cluster.fork();
  }

  // Listen for dying workers
  cluster.on('exit', function () {
    cluster.fork();
  });
}

如果您正在生成8个线程,并且每个线程在同一位置附加一个侦听器(
user sent
),则每个线程将为该位置下的每个子线程触发
child\u added
事件。这是预期的行为

如果要实现工作队列,其中
用户发送的
下的每个节点仅由一个线程处理,则必须使用工作分配机制,以确保只有一个线程可以声明每个节点


使用Firebase数据库事务实现这样的工作声明机制。它已经被用来扩展到中小型员工(想想<10人,而不是几十人)。

谢谢Frank!我想知道你为什么建议不要超过10个工人?这与事务伸缩性不好有关吗?我可能需要扩展10+,但对我来说,主要的瓶颈是CPU密集型计算,而不是实际更新Firebase,因此我可能能够以某种方式将该部分卸载到其他地方。在某个时候,您会遇到争用问题,因为所有工作人员都在修改相同的任务队列。当然,这一切都取决于业务的规模,所以ymmv。如果你碰到这样的限制,考虑替代的工作分配系统。一些不那么民主的东西(例如,一个单一的工作分配服务)可能会进一步扩展,因为争议可能会减少。我明白了,谢谢你的解释。如果您不介意的话,最后一件事是,我编写了一个简单的队列实现,用于将有效负载推送到Firebase,并启动了6个进程,队列中有100个项目,只是为了测试工作人员分配工作的情况,我让3名工作人员完成几乎所有的工作,而其他三名工作人员只完成全部100个任务中的2个任务,如图所示,你知道为什么会发生这种情况吗?这取决于我的代码,还是取决于队列是如何实现的?再次感谢。很好的问题,很遗憾我不知道答案。如果您怀疑它与队列实现有关,那么在repo上发布一个复制最少的问题可能是值得的。
ref.child('user-sent').on('child_added', function(snapshot) {

            var message = snapshot.child('message');

            payload['user-received/'] = message;

            ref.update(payload); // this occurs once for each fork so it updates 8 times
    });