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

时间:2017-02-05 00:17:31

标签: javascript node.js firebase firebase-realtime-database

我一直在尝试在我的节点js app中启用群集。目前我使用此代码段启用它:

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();
  });
}

基本上我的代码根据条件执行对Firebase数据库的写入。问题是写入每次发生8次,而不是一个工作人员只处理一个写入任务,似乎所有线程都在执行所有任务。有办法避免这种情况吗?如果是这样,有人能指出我对这方面的一些资源的方向吗?我在谷歌上找不到任何使用Firebase和节点js群集的东西。以下是我的一个函数的工作方式示例(ref是我的firebase引用):

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
    });

1 个答案:

答案 0 :(得分:1)

如果您正在生成8个线程并且每个线程在同一位置(user-sent)附加一个侦听器,则每个线程将为该位置下的每个子节点启动child_added事件。这是预期的行为。

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

firebase-queue library使用Firebase数据库事务实现了此类工作声明机制。它被用来扩展到中小数量的工人(想想&lt; 10,而不是几十个)。