Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在节点集群中保留共享所有节点进程的变量?_Javascript_Node.js_Node Cluster - Fatal编程技术网

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

Javascript 如何在节点集群中保留共享所有节点进程的变量?,javascript,node.js,node-cluster,Javascript,Node.js,Node Cluster,似乎所有的node woker进程都在工作,就好像它正在执行同一应用程序的新副本一样。但希望保留一些由节点集群中的所有节点工作者(子进程)共享的变量。有没有一个简单的方法可以做到这一点 所有工作进程实际上都是应用程序的新副本。每个辅助进程都是使用child_process.spawn创建的功能齐全的进程。 所以不,他们不共享变量。也许这样最好。 如果您想在工作进程(通常是会话)之间共享信息,您应该考虑将这些信息存储在数据库中 如果您已经准备好一直使用节点,您可以使用类似于让您的工作人员向主流程询

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

所有工作进程实际上都是应用程序的新副本。每个辅助进程都是使用child_process.spawn创建的功能齐全的进程。 所以不,他们不共享变量。也许这样最好。 如果您想在工作进程(通常是会话)之间共享信息,您应该考虑将这些信息存储在数据库中


如果您已经准备好一直使用节点,您可以使用类似于让您的工作人员向主流程询问数据之类的方法。

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

脚本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!');

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

外部数据库将是一个很好的解决方案,因为它可以解决所有的数据访问问题,但很可能会降低性能

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


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

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

如果您希望以只读方式共享内容,请退出。我将其用于大型内存查找表

刚才在服务器上检查,一个346M的文件总共占用156M的内存(仅在访问的页面中使用mmap),并且mmap对象在44个进程之间共享它,每个进程的开销为350万


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

还没有人提到这一点,但这是一个完美的例子,在最新版本的Node v11.11.0中,它刚刚脱离了实验模式。

您有没有研究过像redis这样的数据库?即使有办法,如果没有适当的锁定机制,这听起来也不是个好主意。@Aaron Dufour谢谢你的回答。对redis是一种选择。我也想过。但是如果不使用数据库,我就不能这样做吗?我认为这样的方法是不存在的。您当然可以想出一些办法,例如使用
process.send
worker.send
(请参阅
集群
文档),但这既不安全也不快速。像Redis这样的临时数据存储肯定是你最好的选择。dnode链接转到
未找到文件
页面我需要传递媒体管道(实例化对象),我不能用Redis或键值存储:|你能分享一个例子吗?我试图从memcache中的child获取数据集,从master获取数据集,但不起作用这更适合作为注释而不是答案