如何将活动WebSocket传递给Node.js中的集群线程?

问题描述 投票:3回答:1

在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,但是这会通过在多个线程上运行东西而失去一些性能优势。

那么有人有任何想法吗?

node.js multithreading sockets websocket child-process
1个回答
3
投票

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);
            });
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.