如何保持共享在节点集群中的所有节点的过程变量?(how to keep variables that

2019-08-16 21:53发布

这似乎是因为如果它在执行同一应用程序的新副本的所有节点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的最新版本进行了实验模式。



文章来源: how to keep variables that share all node processes in node cluster?