如何保持共享节点集群中所有节点进程的variables?

似乎所有的节点工作进程都在工作,就好像它正在执行同一个应用程序的新副本一样。 但是想保留节点集群中所有节点工作者(subprocess)共享的variables。 有一个简单的方法来做到这一点?

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

如果你已经准备好了,那么你可以使用像dnode这样的东西让你的工作人员向主进程询问数据。

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

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

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

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

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

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

怎么样:在数据库上存储variables,每次有值更改通知实例。 他们可以将新值存储在本地variables中,只在需要时才调用db调用

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

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

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