Nodejs Cluster


最初的 Node.js 多进程(cluster)模型就是这样实现的,master 进程创建 socket,绑定到某个地址以及端口后,自身不调用 listen 来监听连接以及 accept 连接,而是将该 socket 的 fd 传递到 fork 出来的 worker 进程,worker 接收到 fd 后再调用 listen,accept 新的连接。但实际一个新到来的连接最终只能被某一个 worker 进程 accpet 再做处理,至于是哪个 worker 能够 accept 到,开发者完全无法预知以及干预。这势必就导致了当一个新连接到来时,多个 worker 进程会产生竞争,最终由胜出的 worker 获取连接。

后来不会有惊群了,当工人进程调用http.Server#listen()或net.Server#listen()时,Node.js会给主进程发送一条消息,让它创建一个服务器socket,绑定好,并分享给这个工人进程。如果已经有绑定好的socket了,主进程就会跳过"创建和绑定"那一步,只需分享已有的socket就可以了。

Node.js v0.8和v0.10中cluster分配连接的算法很简单。操作系统会针对运行中的进程收集大量的指标,所以应该最有资格决定唤醒哪个进程。
Node.js v0.11.2中的cluster模块换成了round-robin方式。round-robin 只是其中的某种算法而已,当然可以换成其他的。
cluster.schedulingPolicy 设置调度策略