cluster集群

我们知道,nodejs的event loop或者说事件响应处理器是单线程的,但是现在的cpu基本上都是多核的,为了充分利用现代cpu多核的特性,我们可以创建cluster,从而使多个子进程来共享同一个服务器端口。

也就是说,通过cluster,我们可以使用多个子进程来服务处理同一个端口的请求。

先看一个简单的http server中使用cluster的例子:

cluster详解

cluster模块源自于lib/cluster.js,我们可以通过cluster.fork()来创建子工作进程,用来处理主进程的请求。

cluster中的event

cluster继承自events.eventemitter,所以cluster可以发送和接收event。

cluster支持7中event,分别是disconnect,exit,fork,listening,message,online和setup。

在讲解disconnect之前,我们先介绍一个概念叫做ipc,ipc的全称是inter-process communication,也就是进程间通信。

ipc主要用来进行主进程和子进程之间的通信。一个工作进程在创建后会自动连接到它的主进程。 当 ‘disconnect’ 事件被触发时才会断开连接。

触发disconnect事情的原因有很多,可以是主动调用worker.disconnect(),也可以是工作进程退出或者被kill掉。

exit事件会在任何一个工作进程关闭的时候触发。一般用来监测cluster中某一个进程是否异常退出,如果退出的话使用cluster.fork创建新的进程,以保证有足够多的进程来处理请求。

fork事件会在调用cluster.fork方法的时候被触发。

主进程和工作进程的listening事件都会在工作进程调用listen方法的时候触发。

其中worker代表的是工作线程,而address中包含三个属性:address、 port 和 addresstype。 其中addresstype有四个可选值:

  • 4 (tcpv4)
  • 6 (tcpv6)
  • -1 (unix 域 socket)
  • ‘udp4’ or ‘udp6’ (udp v4 或 v6)

message事件会在主进程收到子进程发送的消息时候触发。

当主进程生成工作进程时会触发fork,当工作进程运行时会触发online。

setupmaster方法被调用的时候,会触发setup事件。

cluster中的方法

cluster中三个方法,分别是disconnect,fork和setupmaster。

调用cluster的disconnect方法,实际上会在cluster中的每个worker中调用disconnect方法。从而断开worker和主进程的连接。

当所有的worker都断开连接之后,会执行callback。

fork方法,会从主进程中创建新的子进程。其中env是要添加到进程环境变量的键值对。

fork将会返回一个cluster.worker对象,代表工作进程。

最后一个方法是setupmaster:

默认情况下,cluster通过fork方法来创建子进程,但是我们可以通过setupmaster来改变这个行为。通过设置settings变量,我们可以改变后面fork子进程的行为。

我们看一个setupmaster的例子:

cluster中的属性

通过cluster对象,我们可以通过ismaster和isworker来判断进程是否主进程。

可以通过worker来获取当前工作进程对象的引用:

可以通过workers来遍历活跃的工作进程对象:

每个worker都有一个id编号,用来定位该worker。

cluster中的worker

worker类中包含了关于工作进程的所有的公共的信息和方法。cluster.fork出来的就是worker对象。

worker的事件和cluster的很类似,支持6个事件:disconnect,error,exit,listening,message和online。

worker中包含3个属性,分别是:id,process和exitedafterdisconnect。

其中id是worker的唯一标记。

worker中的process,实际上是childprocess对象,是通过child_process.fork()来创建出来的。

因为在worker中,process属于全局变量,所以我们可以直接在worker中使用process来进行发送消息。

exitedafterdisconnect表示如果工作进程由于 .kill() 或 .disconnect() 而退出的话,值就是true。如果是以其他方式退出的话,返回值就是false。如果工作进程尚未退出,则为 undefined。

我们可以通过worker.exitedafterdisconnect 来区分是主动退出还是被动退出,主进程可以根据这个值决定是否重新生成工作进程。

worker还支持6个方法,分别是:send,kill,destroy,disconnect,isconnected,isdead。

这里我们主要讲解一下send方法来发送消息:

可以看到send方法和child_process中的send方法参数其实是很类似的。而本质上,worker.send在主进程中,这会发送消息给特定的工作进程。 相当于 childprocess.send()。在工作进程中,这会发送消息给主进程。 相当于 process.send()。

在上面的例子中,如果是在主进程中,那么可以使用worker.send来发送消息。而在子进程中,则可以使用worker中的全局变量process来发送消息。

总结

使用cluster可以充分使用多核cpu的优势,希望大家在实际的项目中应用起来。

以上就是浅谈nodejs中创建cluster的详细内容,更多关于nodejs中创建cluster的资料请关注www.887551.com其它相关文章!