在Node.js中,它们提供了一种方便的方法,通过以下方式将net.Sockets传递给子进程(cluster.Worker):
var socket; // some instance of net.Socket
var worker = process.fork();
worker.on("online", function() {
worker.send("socket", socket);
});
这是非常酷,工作轻松。但是我如何使用WebSocket连接执行此操作?我愿意尝试任何模块。
目前我已尝试使用各种模块,如ws。他们中的大多数存储初始的net.Socket HTTP Request然后升级它,但是没有一个看起来很简单,可以作为net.Socket传递到子进程,因为他们需要大量的WebSocket规范所需的握手信息,尽我所能告诉。
我知道有一些hackish解决方案,比如在一个唯一的端口上打开子进程上的WebSocket服务器,然后告诉WebScoket连接在该端口上重新连接,但是我需要为每个子线程打开一个端口。或者,通过process.send将所有数据传递给WebSocket连接,这样主线程可以完成所有io,但是这会通过在多个线程上运行东西而失去一些性能优势。
那么有人有任何想法吗?
Welp我明白了。 ws可能对我的预期目的太过分了。相反,我找到了一个相当模糊的WebSocket库,lark-websocket,它公开了一个函数,给定一个net.Socket
可以将它包装在它们的Client类中并使用它作为WebSocket。唯一的问题是父线程和子线程都会尝试ping另一端的连接,所以我不得不使用fork it并为父线程添加一种暂停ping的方法。
以下是任何感兴趣的人的示例代码:
var cluster = require("cluster");
var ws = require('lark-websocket');
if(cluster.isMaster) { // make a child process and pipe all ws connections to it
var worker = cluster.fork();
worker.once("online", function() {
console.log("worker online with pid", worker.process.pid);
})
ws.createServer(function(client, request){
worker.send("socket", client._socket); // send all websocket clients to the worker thread
}).listen(27015);
}
else { // we are a worker, so we handle the ws connections
process.on("message", function(message, handler) {
if(message === "socket") { // Note: Node js can only send sockets via handler if message === "socket", because passing sockets between threads is sketchy as fuck
var client = ws.createClient(handler);
client.on('message',function(msg){
console.log("worker " + process.pid + " got:", msg);
client.send("I got your: " + msg);
});
}
});
}