在Node.js中,它们公开了一种方便的传网方式。到子进程(cluster.Worker)的套接字通过:
var socket; // some instance of net.Socket
var worker = process.fork();
worker.on("online", function() {
worker.send("socket", socket);
});
这是超级酷和工作方便。但是我该如何使用WebSocket连接来实现这一点呢?我愿意尝试任何模块。
目前,我已经尝试过使用各种模块,比如ws。它们大多存储初始网络。套接字HTTP请求,然后升级它,但似乎没有一个简单到可以作为网络传递给子进程。套接字,因为据我所知,他们需要WebSocket规范所需的大量握手信息。
我知道有一些破解的解决方案,比如在一个唯一端口上的子进程上打开一个WebSocket服务器,然后告诉WebScoget连接在该端口上重新连接,但我需要为每个子线程打开一个打开的端口。或者,通过process.send将所有数据管道传输到WebSocket连接,这样主线程就可以完成所有io,但这会因为在多个线程上运行而失去一些性能优势。
有人有什么想法吗?
我想明白了。ws可能对我的预期目的来说太多了。相反,我发现了一个非常模糊的WebSocket库,即lark-WebSocket,它公开了一个函数,给定net.Socket
,该函数可以将其封装在他们的Client类中,并将其作为WebSocket使用。唯一的问题是,父线程和子线程都会尝试在另一端ping连接,所以我不得不分叉它,并为父线程添加一种暂停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);
});
}
});
}