2017-10-24 3 views
1

Ich versuche, eine Beschränkung zu überwinden, die auf wie viele Verbindungen TCP Protokoll kann auf einem einzigen Port geöffnet haben. Also dachte ich, eine Möglichkeit, mehrere Instanzen von meinem Server zu erstellen, die auf verschiedene Ports zum Beispiel ausgeführt wird:socket.io Router, zuweisen zu einer von mehreren Instanzen

  • Instanz 1 (3001) server_i1.js
  • Beispiel 2 (3002) server_i2.js
  • Beispiel 3 (3003) server_i3.js
  • Beispiel 4 (3004) server_i4.js

dann könnte ich eine server_route.js zusätzliche Datei, die prüfen würde, wie viele verbinden Ionen werden für jede Instanz eingerichtet und der Benutzer wird an die weniger befüllte Instanz weitergeleitet. Ich habe versucht, etwas mit Cluster zu erstellen, aber es scheint nur neue Prozesse auf dem gleichen Port zu erstellen. Wie kann es gemacht werden, damit alle Benutzer zum Beispiel eine Verbindung zu http://exmaple.com:3000 herstellen und sie dann an einen von vier möglichen Ports [3001, 3002, 3003, 3004] weiterleiten?

aktuelle Server-Ansatz:

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); 

} 

Antwort

1

Vielleicht Round-Robin benutzen? Eine Beispielimplementierung würde wie folgt aussehen:

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

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

Auf client einem

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

das ist wirklich schöner Gedanke tun würde, wäre das einzige Problem mit sein, wie Last zwischen Servern verteilen, haben Sie irgendwelche Gedanken auf, wie man ? – Mevia

+0

@mevia das ist die Sache von Round Robin. Wenn es viele Verbindungen gibt, wird die Arbeitslast gleichmäßig auf die Server aufgeteilt ... –

Verwandte Themen