在master/worker集群部分的一个错误_深入浅出Node.js书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > > 深入浅出Node.js > 在master/worker集群部分的一个错误
小猪 深入浅出Node.js 的书评 发表时间:2014-06-30 21:06:51

在master/worker集群部分的一个错误

刚看完了,整体来说,写的非常不错,这里指出一个我认为的错误或者是描述的不严谨,关于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的解释。

展开全文
有用 0 无用 0

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“在master/worker集群部分的一个错误”的回应

微笑吧还是 2015-01-18 17:09:20

这段话我读了好多遍,感觉原文表述是有点问题的:

关于var server = new net.Server(); 这里的server对象在js层次只是对linux中socket的简单封装,其真正的socket fd还是在c++层次控制的。node.js在父子进程间发送server对象,实际上在底层是通过sendmsg将socket fd句柄发送了过去。在子进程里只需要重新new个net.Server()对象,并使用这个传过来的socket fd。而这个socket在父进程中已经处于listen状态了,所以多个子进程相当于绕过了各自listen的冲突直接等待accept就ok了。而原文中解释为SO_REUSEADDR有点不严谨。

朴灵 2014-08-22 23:35:37

Node中的fork跟操作系统的fork是有区别的,所以并不是继承父进程的描述符