在Node.JS收到连接时分叉新进程

时间:2014-05-19 14:19:59

标签: node.js child-process

我正在运行涉及繁重子进程I / O的Node.JS应用程序。由于Node.JS处理文件描述符的方式(以及其他原因),我想为服务器的每个连接分叉一个新的V8实例。 (是的,我知道这是一个可能很昂贵的操作,但这不是这个问题的重点。)

我正在为我的服务器使用nssocket,但这个问题也应该适用于其他类型的Node.JS服务器(express,Socket.IO等)。

现在我有:

var server = require("nssocket").createServer(function(socket){
    // Do stuff with the new connection
}).listen(8000);

直观的事情是:

// master.js
var server = require("nssocket").createServer(function(socket){
    // Fork a new process to handle the connection
    child_process.fork("worker.js");
}).listen(8000);

// worker.js
// Do stuff with the new connection

但是,子进程无法访问socket变量。

我已经阅读过Node中的新cluster API,但它看起来并不像你希望每个连接产生一个新工作者的情况。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

群集API可能最接近您的需求。理论上,您可以在主进程中随时调用cluster.fork()。请注意,一旦建立套接字连接,就无法将其交给另一个进程。

要将通信转发给工作人员,您可以使用消息传递(即worker.send),或者您可以在工作进程中打开另一个端口并将客户端指向该处。

我应该强调,运行比CPU内核更多的工作进程可能不是一个好主意。您是否考虑过汇集工作人员或使用Beanstalkd等工作队列?

答案 1 :(得分:0)

您可以使用群集模块分叉工作人员,然后使用IPC(进程间通信)通道和消息传递队列来在主进程和工作程序之间传递对象。一个很好的选择是ZMQ