我一直在尝试在我的节点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
});
答案 0 :(得分:1)
如果您正在生成8个线程并且每个线程在同一位置(user-sent
)附加一个侦听器,则每个线程将为该位置下的每个子节点启动child_added
事件。这是预期的行为。
如果要实现工作队列,user-sent
下的每个节点仅由一个线程处理,则必须使用工作分配机制,确保只有一个线程可以声明每个节点。
firebase-queue library使用Firebase数据库事务实现了此类工作声明机制。它被用来扩展到中小数量的工人(想想&lt; 10,而不是几十个)。