我正在运行涉及繁重子进程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,但它看起来并不像你希望每个连接产生一个新工作者的情况。
有什么想法吗?
答案 0 :(得分:0)
群集API可能最接近您的需求。理论上,您可以在主进程中随时调用cluster.fork()
。请注意,一旦建立套接字连接,就无法将其交给另一个进程。
要将通信转发给工作人员,您可以使用消息传递(即worker.send
),或者您可以在工作进程中打开另一个端口并将客户端指向该处。
我应该强调,运行比CPU内核更多的工作进程可能不是一个好主意。您是否考虑过汇集工作人员或使用Beanstalkd等工作队列?
答案 1 :(得分:0)
您可以使用群集模块分叉工作人员,然后使用IPC(进程间通信)通道和消息传递队列来在主进程和工作程序之间传递对象。一个很好的选择是ZMQ。