似乎所有的节点工作进程都在工作,就好像它正在执行相同应用程序的新副本一样。但是想保留节点集群中所有节点工作人员(子进程)共享的变量。有没有简单的方法来做到这一点?如何保留共享节点集群中所有节点进程的变量?
回答
所有工作进程确实是应用程序的新副本。每个工作者都是使用child_process.spawn创建的全功能流程。 所以不,他们不共享变量。这可能是最好的方式。 如果您想在工作进程(通常会话)之间共享信息,您应该查看将这些信息存储在数据库中。
如果您准备好一直走节点,您可以使用类似dnode这样的东西让您的工作人员向主进程询问数据。
您可以尝试在主进程和子进程之间进行通信。例如:
脚本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!');
我觉得集群的整体思路是具有可独立运行的实例不同的cpus。共享内存(一个全局变量),它们都可以访问和更改引入更多的复杂性(锁等),并使这些实例相互依赖。
外部数据库将是一个很好的解决方案,因为它处理所有数据访问问题,但它很可能会降低性能。
消息传递是一个更好的主意。您可以在集群中保存var的本地实例。当群集更新该值时,向其余部分发送消息并更新该值。这非常棒,因为它是异步和非阻塞的,但您的价值更新不会立即反映出来。
这个怎么样:在数据库上存储变量,每次值变化都会通知实例。他们可以将新值存储在本地变量中,并仅在需要时才拨打db调用
我为它使用了外部memcached或redis服务器。
你能分享一个例子吗?我打算从memcache中的子项获取数据集以从master获取数据集,但不工作 – mithra 2016-01-20 10:26:58
这适合作为评论而不是作为答案 – renatoargh 2017-05-08 19:03:35
如果您想要以只读方式分享内容,请查看mmap-object。我将它用于大内存查找表。
刚刚在一台服务器上检查,一个346M文件总共占用了156M的内存(mmap只能访问内存中的页面)和mmap对象在44个进程中共享,每个进程的开销为3.5M。
因为它是只读的,所以我不必担心进程间锁定和可能带来的混乱。
- 1. 主节点如何启动hadoop集群中的所有进程?
- 2. 节点群集
- 3. 所有kafka集群节点上的SSL
- 4. GCE集群所有节点NotReady
- 5. 影响所有节点与共享类
- 6. Hadoop集群中的节点数量
- 7. 用新节点替换cassandra集群中的现有节点
- 8. 单节点群集在多节点群集上工作?
- 9. 是否可以为节点js中的所有集群节点设置“COMMON”变量?
- 10. 2节点的Cassandra集群
- 11. Hadoop的2节点集群
- 12. 使用Cytoscape.js进行节点群集
- 13. 如何从所选节点的所有子节点中jstree
- 14. 节点与群集与节点与线程gogo
- 15. Vertica C.E.集群节点号?
- 16. RabbitMQ集群节点故障
- 17. Cassandra集群单节点
- 18. Cassandra集群与节点
- 19. h2o群集多节点
- 20. Cypher:排除共享节点?
- 21. 双节点投影中节点数量多于节点集合
- 22. 如何测量Spark Standalone集群中节点之间的通信?
- 23. 并非所有在Spark Standalone集群中使用的节点
- 24. 发送消息到JBoss集群域中的所有节点
- 25. 列出Erlang集群中的所有节点
- 26. 如何获取PowerShell中的子节点的所有父节点
- 27. RabbitMQ集群中的Rogue节点
- 28. 更改hadoop群集中节点的FQDN
- 29. 集群挤压GraphViz中的节点
- 30. 如何获取fancytree中节点的所有子节点?
你看过像redis这样的数据库吗?即使有办法,没有适当的锁定机制,这听起来像一个坏主意。 – 2013-02-12 06:08:00
@Aaron Dufour感谢您的回复。是。 redis是一种选择。我也想过了。但是我不能使用数据库来做到这一点吗? – 2013-02-12 06:23:29
我不认为这样的方法存在。您当然可以想出一些东西,例如使用'process.send'和'worker.send'(请参阅'cluster'文档),但它既不安全也不快。像Redis这样的临时数据存储绝对是您的最佳选择。 – 2013-02-12 14:30:37