在一个主机启动多个服务器进程,让这些进程监听同一个端口号是不可能的 ,这是因为服务器的套接字文件描述符不相同,一个socket一个描述符只能用一个端口,所以在node.JS中想多进程监听同一个端口,之前的做法是主进程监听主端口,然后将请求分别代理到不同端口的子进程上,缺点是每创建一个socket需要用掉一个描述符,要知道进程描述符和系统描述符有数量限制的。ps:node底层对于每个端口都设置了一个选项,这个选项的含义是服务器套接字可以被不同进程复用的。只有系统级的描述表引用计数为0了才释放
node为了解决这个问题加了一个进程间发送句柄的功能,send()方法不仅可以发送信息还可以发送句柄,句柄(文件描述符)其实是指针,指向内核中的文件信息,句柄对象可以是服务器、套接字(任何具有底层_handle成员的东西)。send()包括handle和message,如果message.cmd的值为NODE_HANDLE,取出message.type的值创建对应的对象,然后监听句柄。进程之间只是传递信息,并不是传递对象,具体底层原理以传递socket为例:参考文章父子进程之间,在同一地址下的 socket 传递时,各自都额外维护一个关联列表存储这些 socket 信息和ChildProcess实例,并且父进程中的net#Server类实例自己保存下所有父进程关联列表。在调用net.Server#getConnections这类方法时,遍历列表中的ChildPorcess实例发送内部消息,子进程列表中的对应项收到内部消息并处理返回,父进程中再结合返回结果和对应着这个ChildProcess类实例维护的 socket 信息,保证功能的正确性。
个人理解,仅保存学习
网友评论