当您使用集群之类的东西分叉或启动多个工作人员时:
是否正在创建节点进程的多个线程或实例?这是否打破了 Node 的单线程概念?
工人之间的请求是如何处理的?Cluster 是否提供了一些智能机制来将所有请求负载平衡到多个工作人员?
当您使用集群之类的东西分叉或启动多个工作人员时:
是否正在创建节点进程的多个线程或实例?这是否打破了 Node 的单线程概念?
工人之间的请求是如何处理的?Cluster 是否提供了一些智能机制来将所有请求负载平衡到多个工作人员?
Cluster
使用fork
,是的,它会自动平衡:
使用该
child_process.fork
方法生成工作进程,以便它们可以通过 IPC 与父进程通信并来回传递服务器句柄。[...]
当多个进程都
accept()
在同一个底层资源上运行时,操作系统非常有效地在它们之间进行负载平衡。Node.js 或您的程序中没有路由逻辑,工作人员之间也没有共享状态。因此,重要的是设计您的程序,使其不会过于依赖内存中的数据对象来处理会话和登录等事情。
如果您将新的 node.js 实例计为另一个线程,您可能会认为这会破坏 node.js 单线程概念,但是请记住,对给定请求的所有回调都将被处理为相同的 node.js 实例accept
编辑了原始请求。没有竞争条件,没有共享数据,只有相当安全的进程间通信。
有关详细信息,请参阅集群文档。
Cluster
是为了弥补 的node.js
单线程架构而开发的。现代处理器具有多个内核,单线程进程将无法利用可用内核。它确实偏离了它的单线程架构,但它从来都不是坚持它的计划。主要概念是异步的、事件驱动的执行。
Cluster 使用 fork 创建进程。分叉进程实际上是具有自己地址空间的自己的进程 - 子进程(通常)无法影响其父进程或兄弟进程的地址空间(与线程不同)。除了在普通 ChildProcess 实例中包含所有方法外,返回的对象还具有内置的通信通道。所有分叉的进程都可以使用此通道进行通信。
注意这里的细微差别:它不是multi-threaded
,它只是创建新的独立进程。请参阅此处的 Threads vs Processes in Linux进行比较。每个工作人员都像以前一样采用单线程架构。所以它不会破坏节点的单线程概念。
负载平衡取决于您的代码本身(因为每个代码都是独立的)和操作系统。操作系统在所有分叉进程和原始进程之间平均平衡负载。
但是,如果您希望以不同的方式进行操作,那也是可能的。如果您使用主线程与工作线程不同,或者每个工作线程专门从事不同的任务(压缩/ffmpeg),您可以这样做。