似乎所有节点woker进程都在运行,就像它正在执行同一应用程序的新副本一样。但是希望保留节点集群中所有节点工作者(子进程)共享的一些变量。有一个简单的方法吗?
答案 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中刚刚脱离实验模式。