在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请求,然后对其进行升级,但是似乎没有一个简单的方法可以将其作为net.Socket传递给子进程,因为据我所知,它们需要WebSocket规范所需的大量握手信息。告诉。
我知道有一些棘手的解决方案,例如在子进程上的唯一端口上打开WebSocket服务器,然后告诉WebScoket连接在该端口上重新连接,但随后我需要为每个子线程打开一个端口。或者,通过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);
});
}
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句