Javascript NodeJS-是否可以有两个独立的集群?
TL;DR 有可能有两个不同的集群主节点不是共享的全局节点吗?例如创建一个新实例Javascript NodeJS-是否可以有两个独立的集群?,javascript,node.js,multithreading,cluster-computing,global,Javascript,Node.js,Multithreading,Cluster Computing,Global,TL;DR 有可能有两个不同的集群主节点不是共享的全局节点吗?例如创建一个新实例myCluster=newcluster() 较长的版本 在NodeJS中使用新的集群模块一段时间后,我遇到了两个独立集群重叠的问题。两个不同的库(npm包)访问同一个集群主机,因为集群模块在当前运行的进程中是全局的,无论您从哪里需要它 从任何库调用cluster.workers,都会列出每个库生成的每个worker 每个人都在为它的简单性和效率而发狂,但是在遇到两个库使用同一个集群的问题之后,我担心使用一些全局集群
myCluster=newcluster()
较长的版本
在NodeJS中使用新的集群模块一段时间后,我遇到了两个独立集群重叠的问题。两个不同的库(npm包)访问同一个集群主机,因为集群模块在当前运行的进程中是全局的,无论您从哪里需要它
从任何库调用cluster.workers
,都会列出每个库生成的每个worker
每个人都在为它的简单性和效率而发狂,但是在遇到两个库使用同一个集群的问题之后,我担心使用一些全局集群函数(如cluster.disconnect()
)会相互干扰,或者访问全局workers对象集群.workers
。我知道这是一个相当单一的用例模块,“创建一个自我可持续的一次性工人集群,可以通过看门狗轻松重启”
但对于多线程任务来说,它是最简单的解决方案,而且在child\u进程
上粉饰了很多麻烦。如果两个库决定有必要使用集群
,但没有努力跟踪属于它们的工作人员,而是称之为厚颜无耻的
Object.values(cluster.workers).forEach(worker => worker.kill())
作为他们的清理
集群是否可以有两个不同的“实例”或“名称空间”,以避免干扰任何其他集群主机?或者集群模块只是一个必须接受的全局变量
我已经深入研究了文档,但据我所知,无法通过调用myCluster=new cluster()
来创建新的集群实例,也无法将一些唯一标识传递给forked worker。我感到惊讶的是,这个问题没有明显的解决方案,特别是考虑到它针对的是企业应用程序,而这些应用程序不应该存在这样的问题
编程的趋势(已经有一段时间了)是远离全局实例,创建只知道需要知道什么的自给自足实例,即所谓的“哑组件”。集群是NodeJS的一个全新的补充,他们是否已经决定一半实现一个伟大的特性
我将非常感谢你在这个问题上的想法或解决办法。现在我正在创建一个可以从任务分发中获益匪浅的库,但是我不想弄脏依赖于包的全局集群。我应该回到低级的子进程吗
非常感谢 不,或者是
请参阅,因为节点术语中的集群意味着分叉当前进程,所以实际上没有集群——只有一个分叉=工作者的列表
但是:您可以使用fork并要求脚本(或者如果是在块中)将fork作为一个worker,并将该新worker保存到您自己的array=cluster/fork\u列表中
我有一个简单的支持模块,用于分离工作脚本(并简单地加载不同的脚本+处理通信):回答我自己的问题
在切换到较低级别的child\u进程
模块后,出于一个简单的原因,我已恢复到使用集群
。js的——检查调试器
在调试另一个包时经历了很多痛苦之后,我将错误追溯到一个依赖项,该依赖项是我自己实现child\u进程方法的库。它使用从父进程继承的execArgs
来派生子进程
,这意味着子进程
正试图绑定到与父进程相同的检查器端口,无声地失败并崩溃
虽然我的第一个解决方法是为子进程
生成一个随机免费(由操作系统分配)调试端口,但这是一个有效的解决方法,但也带来了自己的问题。首先,必须通过每次复制唯一端口来手动将进程附加到调试器
VS代码有一个神奇的AutoAttachChildProcesss
,它可以发现分叉的进程,但只有在使用集群时才能发现,至少在我的情况下是这样。似乎cluster
在分叉过程中有一些糖衣,使得它在调试过程中更容易发现和适应,或者VS代码只监听cluster.fork()
。我已经放弃了让我的工作人员对整个应用程序可见的缺点,转而为用户提供更强大的体验
这是一种恼人的行为,在GitHub上有一个公开问题:
我的结论是,集群模块是为了提供更统一的分叉体验和更智能的进程处理和发现,包只需尊重永不接触cluster.workers
或类似的全局函数,而是维护由cluster.fork()返回的自己的worker数组
这就是我害怕的。。。不管是否分叉(您可以设置一个自定义脚本来开始使用集群),都应该有一个选项来创建一个本地化实例,该实例维护自己的工作线程数组。在我看来,没有理由让它全球化。我目前的解决方案是创建我自己的“集群”类,该类维护自己的工作人员列表,并使用child\u process
对其进行管理。http服务器和其他服务器使用全局集群来处理负载平衡,并将一个使用过的端口分发到分支。还有一些其他模块依赖于此。如前所述:这都是关于分叉当前进程,而不是启动其他脚本。“群集”。我相信我已经看到NPM上的模块实际管理集群。