node.js是单进程应用,要充分利用多核cpu的性能,就需要用到多进程架构。
作为web服务器,不能多个进程创建不同的socket文件描述符去accept网络请求, 有经验的同学知道,如果端口被占用了,再跑一个监听该端口的服务就会报EADDRINUSE异常。那么问题来了,多进程架构如何去解决这个问题?
我们把多进程架构设计成典型的master-workers架构, 一个master, 多个worker。
我们可以在master进程代理accept请求然后分配给worker处理。但客户端进程连接到master进程,master进程连接到worker进程需要用掉两个文件描述符,会浪费掉一倍数量的文件描述符。
所以交由worker来accept请求会是更好的方案。
master先创建一个server监听端口,然后通过进程间通信,把socket文件描述符传递给所有的worker进程, worker进程用传递过来的socket文件描述符封装成server(感官上好像是把一个server对象发送给另一个进程,其实是把相应的句柄封装后,通过JSON.stringify()序列化再发送, 接收端进程还原成相应的句柄。)
然后,还有一个问题,假如其中一个worker进程异常退出了怎么办, 这个时候,worker进程应该要通知到master进程,然后master进程重新fork一个worker进程。
先上master的代码:
node.js是单进程应用,要充分利用多核cpu的性能,就需要用到多进程架构。
"use strict"
const fork = require('child_process').fork;
const