如何保留共享节点集群中所有节点进程的变量?

时间:2013-02-12 05:56:36

标签: javascript node.js node-cluster

似乎所有节点woker进程都在运行,就像它正在执行同一应用程序的新副本一样。但是希望保留节点集群中所有节点工作者(子进程)共享的一些变量。有一个简单的方法吗?

6 个答案:

答案 0 :(得分:18)

所有工作进程确实是应用程序的新副本。每个worker都是使用child_process.spawn创建的全功能进程。 所以不,他们不共享变量。这可能是最好的方式。 如果要在工作进程(通常是会话)之间共享信息,则应考虑将这些信息存储在数据库中。

如果您已准备好一直使用节点,则可以使用类似dnode的内容让您的工作人员向主进程请求数据。

答案 1 :(得分:12)

您可以尝试在主进程和子进程之间进行通信。例如:

脚本test.master.js:

var cluster = require('cluster');
var childScript = __dirname + '/test.child.js';

cluster.setupMaster({ exec: childScript });

proc = cluster.fork();
proc.on('message', function(message) {
    console.log('message from child: ', message);
    proc.send('Hello from master!');
});

脚本test.child.js:

console.log('Child initializing..');

process.on('message', function(message) {
    console.log('message from master: ', message);
});

process.send('Hello from Child!');

答案 2 :(得分:4)

我使用外部memcached或redis服务器。

答案 3 :(得分:2)

我认为群集的整个想法是拥有可以在不同的cpu上独立运行的实例。共享它们都可以访问和更改的内存(全局变量)会引入更多的复杂性(锁等),并使这些实例相互依赖。

外部数据库可以很好地解决这个问题,因为它可以解决所有数据访问问题,但很可能会降低性能。

消息传递是一个更好的主意。您可以在群集中保存var的本地实例。当群集更新该值时,将消息发送给其余的值并更新该值。这很好,因为它是异步和非阻塞,但你的价值更新不会立即反映出来。

这个怎么样:在数据库上存储变量,每次有值更改时都会通知实例。他们可以将新值存储在本地变量中,并仅在需要时进行db调用

答案 4 :(得分:1)

如果您想以只读方式分享内容,请查看mmap-object。我将它用于大型内存中查找表。

刚刚在服务器上检查,一个346M文件占用了总共156M的内存(仅访问了mmap页面),mmap-object在44个进程之间共享它,每个进程的开销为3.5M。 / p>

因为它是只读的,所以我不必担心进程间锁定和可能带来的混乱。

答案 5 :(得分:0)

目前还没有人提及,但这是Node Worker Threads的一个完美案例,它在最新版的Node v11.11.0中刚刚脱离实验模式。