在master/worker集群部分的一个错误
2014-06-30
刚看完了,整体来说,写的非常不错,这里指出一个我认为的错误或者是描述的不严谨,关于master/worker集群的端口共同监听的解释,尽管只有短短的一段话,但是感觉解释的是错误的或者是有误导性的,原文如下,
“对于独立启动的进程互相之间并不知道文件描述符(应该是套接字描述符),所以监听相同端口时就会失败,但对于send发送的句柄(应当是套接字描述符)还原出来的服务而言,他们的文件描述符是相同的,所以监听相同端口不会引起异常”
在这里貌似是在强调send发送了相同值的文件描述符,然后new了一个server对象,用这个值重新监听,就不会错误,
var server = new net.Server();
server.listen(handle,...)
但是最关键的是worker进程是master fork出来的,它本身继承了父进程的描述符,他需要在这个套接字描述符重新bind并且listen,这时候就像书中说的“node底层对每一个端口监听都设置了SO_REUSEADDR选项,这个选项的含义是不同进程可以就相同的网口和端口进行监听”,这句话说的毛病也很多,不是任意不同进程都可以,具体大家可参照unix网络编程第三版第一卷p165对SO_REUSEADDR和SO_REUSEPORT的解释。