这似乎是因为如果它在执行同一应用程序的新副本的所有节点woker过程都在工作。 不过,想继续由在节点集群中的所有节点的工人(子进程)共享一些变量。 有没有一种简单的方法来做到这一点?
Answer 1:
所有的工作进程确实是你的应用程序的新副本。 每个工人是child_process.spawn创建一个全功能的过程。 所以,不,他们不共享变量。 它可能是最好这样。 如果你想分享的工作进程(通常是会话)之间的信息你应该考虑在数据库中存储这些信息。
如果你已经准备好节点的所有方式,你可以使用类似dnode有你的工人要求对数据的掌握过程。
Answer 2:
您可以尝试主进程和子进程之间的通信。 例如:
脚本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!');
Answer 3:
我用外部的memcached或Redis的服务器吧。
Answer 4:
我觉得集群的整体思路是具有可以在不同的CPU独立运行的实例。 共享内存(一个全局变量),它们都可以访问和更改引入更多的复杂性(锁等),使这些情况下互相依赖。
外部数据库将是一个很好的解决了这个,因为它需要所有的日数据访问问题的照顾,但它很可能会降低性能。
消息是一个更好的主意。 您可以在集群持有VAR的本地实例。 当群集更新值,将消息发送到他们的休息和更新的价值。 这是伟大的,因为它的异步无阻塞但同样你的价值更新不会立即反映。
这个怎么样:商店瓦尔在分贝,每次有一个值变化通知实例。 它们可以存储在本地变量的新值,并调用数据库需要真实,只有当它
Answer 5:
如果你正在寻找一个只读的基础上分享信息,检查出MMAP对象 。 我用它的大内存的查找表。
刚才检查服务器上,一个346M的文件(在什么是访问的mmap仅页)共有的内存156M占用和MMAP对象分享这44个流程,每个流程的开销3.5M的。
因为它是只读的,我不担心进程间的锁定和可携同杂乱。
Answer 6:
还没有人提到这一点,但,这是一个完美的情况下, 节点工作线程刚刚在节点v11.11.0的最新版本进行了实验模式。