2016-08-01 12 views
3

Ich bin neu bei socket.io und Node JS und ich versuche, eine skalierbare Anwendung mit einer hohen Anzahl von gleichzeitigen Socket-Verbindungen (10.000+) zu erstellen.Skalierbare Architektur für socket.io

Derzeit habe ich mit einem Modell begonnen, bei dem mein Server einen untergeordneten Prozess erstellt und jeder untergeordnete Prozess einen bestimmten Port mit einer angehängten sicket.io-Instanz überwacht. Sobald ein Client eine Verbindung herstellt, wird er auf einen bestimmten Port umgeleitet.

Die große Frage ist: Haben mehrere socket.io Instanzen auf mehreren Ports erhöht die Anzahl der möglichen Verbindungen?

Hier ist mein Code, nur für den Fall:

Server

var server = http.createServer(app); 

server.childList = []; 
for (var i = 0; i < app.portList.length; i++) { 
    server.childList[i] = require('child_process').fork('child.js'); 
} 

server.listen(3443,() => { 
    for (var i = 0; i < app.portList.length; i++) { 
    server.childList[i].send({ message: 'createServer', port: app.portList[i] });; 
    } 
}); 

child.js:

var app = require('./app'); 
var http = require('http'); 
var socket_io  = require("socket.io"); 

process.on('message', (m) => { 
    if (m.message === 'createServer') { 

     var childServ = http.createServer(app); 

     childServ.listen(m.port,() => { 
      console.log("childServ listening on port "+m.port); 
     }); 

     var io = socket_io(); 
     io.attach(childServ); 

     io.sockets.on('connection', function (socket) { 
      console.log("A client just connected to my socket_io server on port "+m.port); 
     }); 
    } 
}); 

Fühlen Sie sich frei, die kraken freizugeben, wenn ich dort etwas Schreckliches getan

Antwort

4

Zunächst einmal hängt das, was Sie optimieren müssen, davon ab, wie ausgelastet Ihre socket.io-Verbindungen sind und ob es sich hauptsächlich um asynchrone E/A-Vorgänge oder um CPU-intensive Vorgänge handelt. Wie Sie vielleicht bereits wissen, skaliert node.js bereits sehr gut für asynchrone E/A-Komponenten, benötigt aber mehrere Prozesse, um für CPU-intensive Prozesse gut skalieren zu können. Außerdem gibt es einige Situationen, in denen der Garbage Collector zu beschäftigt ist (viele und viele kleine Anfragen werden bedient) und Sie müssen aus diesem Grund auch zu mehreren Prozessen gehen.

Mehr Serverinstanzen (bis mindestens die Anzahl der CPUs, die Sie im Server haben) geben Ihnen mehr Prozessorleistung (wenn Sie das brauchen). Es erhöht nicht unbedingt die Anzahl der maximalen Verbindungen, die Sie auf einer Box unterstützen können, wenn die meisten von ihnen inaktiv sind. Dafür müssen Sie custom tune your server, um viele und viele Verbindungen zu unterstützen.

Normalerweise möchten Sie N NOCKEN.IO-Server nicht auf einen anderen Port hören. Das belastet die Clients, um irgendwie einen Port auszuwählen, und der Client muss genau wissen, welche Ports auszuwählen sind (z. B. wie viele Server-Instanzen Sie haben).

Normalerweise tun Sie es nicht so. Normalerweise haben Sie N Prozesse, die alle auf demselben Port horchen, und Sie verwenden eine Art Loadbalancer, um die Last unter ihnen zu verteilen.Dadurch wird die Serverinfrastruktur für die Clients transparent, sodass Sie die Server nach oben oder unten skalieren können, ohne das Clientverhalten zu ändern. Tatsächlich können Sie sogar mehr als eine physische Serverbox hinzufügen und die Kapazität sogar noch weiter erhöhen.

Hier ist ein Artikel aus dem socket.io doc über mehrere Knoten mit einem Load Balancer, um die Kapazität zu erhöhen: Socket.io - using multiple nodes. Es gibt auch explizite Unterstützung durch redis for a combination of multiple socket.io instances und Redis, so dass Sie mit jeder socket.io-Instanz kommunizieren können, unabhängig vom Prozess.

2

Hat ha ving mehrere socket.io-Instanzen auf mehreren Ports erhöht die Anzahl der möglichen Verbindungen?

Ja, Sie haben einen einfachen Load-Balancer gebaut, der eine ziemlich übliche Praxis ist. Es gibt einige gute Tutorials über verschiedene Arten der Skalierung von node.js.

Ihr Load Balancer Ihren Code zu einem Punkt beschleunigt, weil Sie mehrere Threads verwenden, aber ich vor einer Weile auf einem anderen Thread gelesen, dass eine Faustregel zu Beginnen Sie mit 2-3 Prozessen pro CPU-Kern. Mehr als das verursachen mehr Overhead als Hilfe, aber das hängt stark von der Situation ab.