我使用Node集群,在每个worker上都有一个正在运行的websocket服务器。主服务器正在运行HTTP服务器。
在主HTTP服务器上,我想要一个HTTP Upgrade调用实现,它将调用者连接到特定的Web套接字。
为什么?我希望能够将用户连接到正确的websocket,但我希望通过一个单一的入口点localhost:8000来完成。连接到localhost:8000可能会无缝连接到localhost:8001。
我的想法是使用如下参数调用Upgrade:
wscat -c ws://localhost:8000/?id=5
此调用应转到主服务器,主服务器将转发此升级调用并与localhost:8005建立连接。
我想我可以简单地用worker. send()将升级参数转发给worker,但这并不起作用,我在worker中接收的对象错过了很多东西,这可能是我不知道的一些JS基础知识。
下面是我的简单实现:
var http = require('http');
var cluster = require('cluster')
var ws = require('ws');
var NumberOfInstances = 5;
if (cluster.isMaster) {
var forks = []
for (var i=0; i < NumberOfInstances; i++) {
forks.push(cluster.fork());
}
server = http.createServer((req, res) => {
res.writeHead(200);
}).listen(8000);
server.on('upgrade', (request, socket, head) => {
var params = new URL(`https://localhost:8000${request.url}`);
var id = parseInt(params.searchParams.get('clusterId')) - 1;
// How do I forward upgrade??
forks[id].send({r: request, s: socket, h: head});
})
} else {
portStr = `800${cluster.worker.id}`;
wss = new ws.WebSocketServer({
port: portStr
});
wss.on('connection', (ws, request) => {
console.log(`${cluster.worker.id} got connection.`);
})
process.on('message', masterMessage => {
// This absolutely doesn't work.
wss.handleUpgrade(masterMessage.r, masterMessage.s, masterMessage.h, (ws) => {
wss.emit('connection', ws, masterMessage.r);
})
})
}
1条答案
按热度按时间kqlmhetl1#
根据文档,您需要将套接字处理程序作为第二个参数发送给
worker.send
方法。所以你应该做这个,
在您的子
message
事件处理程序中,执行以下操作:看看这个例子,看看如何传递套接字对象作为一个参数。