Cluster如何跟上Node的单线程概念?

时间:2013-02-25 15:14:46

标签: node.js node-cluster

当您使用Cluster:

等分叉或启动多个工作人员时
  1. 是否正在创建多个线程或Node进程实例?这是否打破了Node的单线程概念?

  2. 工人之间如何处理请求? Cluster是否提供了一些智能机制来对多个工作人员的所有请求进行负载均衡?

2 个答案:

答案 0 :(得分:6)

Cluster使用fork,是的,它会自动平衡:

  

使用child_process.fork方法生成工作进程,以便它们可以通过IPC与父进程通信并来回传递服务器句柄。

     

[...]

     

当多个进程全部accept()在同一个底层资源上时,操作系统会非常有效地对它们进行负载均衡。 Node.js或程序中没有路由逻辑,工作者之间也没有共享状态。因此,设计程序非常重要,因为它不会过多地依赖内存数据对象来处理会话和登录等事情。

如果将新的node.js实例计为另一个线程,您可能会认为这会破坏node.js单线程概念,但请记住,对给定请求的所有回调都将在同一节点上处理。 js实例accept编辑了原始请求。没有竞争条件,没有共享数据,只有相当安全的进程间通信。

有关详细信息,请参阅Cluster documentation

答案 1 :(得分:3)

Cluster是为了补偿node.js的单线程架构而开发的。现代处理器具有多个内核,单线程进程无法利用可用内核。它确实偏离了它的单线程架构,但从来没有坚持它的计划。主要概念是异步,事件驱动的执行。

  

Cluster使用fork来创建进程。分叉的过程确实是它的   拥有自己的地址空间的自己的进程 - 没有任何东西   孩子可以(通常)做影响其父母或兄弟姐妹的地址   空间(与线程不同)。除了拥有所有方法   正常的ChildProcess实例,返回的对象有通信   频道内置。所有分叉进程都可以使用它进行通信   信道。

注意这里的细微差别:它不是multi-threaded,只是为了创建新的独立进程。请参阅此处Threads vs Processes in Linux进行比较。每个工作者都像以前一样采用单线程架构。所以它不会破坏节点的单线程概念。

负载的平衡取决于您的代码本身(因为每个都是独立的)和操作系统。操作系统在所有分叉进程和原始进程之间平衡负载。

但如果你想以不同的方式做到这一点,也有可能。如果您使用主线程而不是工作线程,或者每个工作人员专门处理不同的任务(压缩/ ffmpeg),您可以这样做。