socket.io 路由器,分配给多个实例之一

socket.io router, assign to one of multiple instances

我正在努力克服 TCP 协议可以在单个端口上打开多少个连接的限制。所以我想到了一种在不同端口上创建服务器 运行 的多个实例的方法,例如:

然后我可以有一个额外的文件 server_route.js 来检查每个实例上建立了多少连接并将用户转发到人口较少的实例。我尝试使用集群构建一些东西,但它似乎只在同一端口上创建新进程。例如,如何让所有用户连接到 http://exmaple.com:3000,然后将它们转发到四个可能的端口之一 [3001, 3002, 3003, 3004]?

当前服务器方法:

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if(cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {

    var http = require('http'),
        _io = require('socket.io'),
        server = http.createServer();

    server.listen('3000', 'example.com');

    var io = _io.listen(server);

    var connections = {},
        msg_sent = 0;

    io.on('connection', function(socket) {

        connections[socket.id] = new Date().getTime();

        socket.on('client-request', function(msg) {
            msg_sent++;
        });

        socket.on('disconnect', function() {
            delete connections[socket.id];
        });

    });

    setInterval(function() {
        console.log( 'Active connections: ', Object.keys(connections).length, 'Messages sent: ', msg_sent );
    }, 1000);

}

也许使用循环法?示例实现如下所示:

 const ports = ["3001"," 3002", "3003"];
 var current = 0;

io.on('connection', function(socket) {
  socket.emit("redirect",ports[current]);
  current = (current + 1) % ports.length;
});

在客户端一个就可以了

(function start(port){
  const socket = io("http://localhost:"+port);
  socket.on("redirect", port => (socket.close(), start(port)));
  //whatever
})(3000);