Javascript 如何在节点集群中保留共享所有节点进程的变量?
似乎所有的node woker进程都在工作,就好像它正在执行同一应用程序的新副本一样。但希望保留一些由节点集群中的所有节点工作者(子进程)共享的变量。有没有一个简单的方法可以做到这一点 所有工作进程实际上都是应用程序的新副本。每个辅助进程都是使用child_process.spawn创建的功能齐全的进程。 所以不,他们不共享变量。也许这样最好。 如果您想在工作进程(通常是会话)之间共享信息,您应该考虑将这些信息存储在数据库中Javascript 如何在节点集群中保留共享所有节点进程的变量?,javascript,node.js,node-cluster,Javascript,Node.js,Node Cluster,似乎所有的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获取数据集,但不起作用这更适合作为注释而不是答案