2012-11-13 15 views
6

Supose Ich muss eine Webanwendung implementieren, die eine hohe Anzahl gleichzeitiger Benutzer hat. Ich entscheide mich dafür, node.js zu verwenden, weil es sehr gut skaliert, gute Leistung hat, Open-Source-Gemeinschaft usw. Um Engpässe zu vermeiden, weil ich mehrere Nutzer in derselben Ereignisschleife haben könnte, entscheide ich mich für einen Cluster von Prozesse, um die Multi-Core-CPU zu nutzen. Außerdem habe ich 3 Maschinen (Haupt + 2), weil ich Big-Data mit Cassandra manipulieren muss. Awesome, das bedeutet, ich habe 3 * n node.js Prozesse, wobei n die Anzahl der Kerne der CPU ist (Maschinen sind identisch).So entwerfen Sie einen verteilten node.js Webserver

Ok, dann beginne ich ein Forschungs- und ich am Ende mit dem folgenden Schema:

  • Nginx der Port 80 überwacht und nur zu dienen statische Inhalte (img, CSS, JS, etc) verwendet.
    Leitet den dynamischen Datenverkehr an haproxy weiter. Ich weiß, wie man nginx konfiguriert, aber ich muss immer noch auf haproxy schauen, also werde ich sagen, dass haproxy Port 4000 hört. Nginx und haproxy sind in der Hauptmaschine (der Einstiegspunkt) installiert.
  • Haproxy Lastbilanzen zwischen den 3 Maschinen. Er leitet Verkehr auf Port 4001, das heißt, die node.js Prozesse zu 4001. hören 4001.

  • Every node.js hat eine Gruppe von n Prozesse hören Wenn ich richtig bin ein einzelnes Die http-Anfrage wird an einen einzelnen node.js-Prozess weitergeleitet.

    Erstellen einer Sitzung ist ganz normal, oder? Eine Sitzung ist nur eine Karte und diese Karte ist ein Objekt und dieses Objekt lebt in einem node.js-Prozess. Haproxy wird mit einem Round-Robin-Scheduler konfiguriert, sodass derselbe Benutzer an verschiedene node.js-Prozesse weitergeleitet werden kann. Wie kann ich das gleiche Sitzungsobjekt für alle node.js-Prozesse freigeben? Wie kann ich ein globales Objekt teilen (dies beinhaltet die gleiche Maschine (node.js cluster) und über das Netzwerk)? Wie soll ich eine verteilte Web-App mit node.js entwerfen? Gibt es Module, die die Synchronisationsaufgaben erleichtern?

  • +1

    Haproxy hat mehrere Möglichkeiten, um Sticky-Sitzungen zu behandeln, http: // stacko verflow.com/questions/6498030/load-balancing-haproxy-or-other-sticky-sessions. Verwenden Sie für ein globales Objekt redis oder etwas. – numbers1311407

    +0

    Ähnlich http://stackoverflow.com/questions/5398209/scaling-node-js-across-multiple-cores-servers auch nur 3 Servern. –

    Antwort

    1

    Sie könnten Memcache oder Redis zum Speichern von Sitzungsobjekten verwenden. Es ist sehr nützlich im Falle eines Neustarts von Knotenprozessen (wenn Sitzungsdaten im Prozessspeicher gespeichert werden, gehen sie verloren).

    Sie können auch überprüfen pm2 Feature-Liste und vielleicht einige von ihnen wäre nützlich für Sie.

    Die Erstellung von Micro-Services-Architektur wird eine gute Skalierbarkeit ermöglichen.

    1

    Wie Ivan betonte, speichern Sie Ihre Sitzungsobjekte in Memcache oder Redis oder sogar Couchbase (Memcache-Buckets). Ich möchte auch hinzufügen, wenn Sie ein skalierbares System erstellen möchten, sollte Ihr Ziel sein, System in einer Weise zu bauen, die Sie linear skalieren können, um den Durchsatz basierend auf dem Bedarf zu erhöhen. Damit meine ich, dass Sie in der Lage sein sollten, zu verschiedenen Zeitpunkten (vorzugsweise während der Hochphase) mehr Hosts zu verschiedenen Ebenen innerhalb Ihrer Infrastruktur hinzuzufügen, um die Anforderungen zu erfüllen.

    Sie müssen also sehr vorsichtig sein bei der Technologie, die Sie auswählen, und bei den Designentscheidungen, die Sie während der Entwicklung treffen.

    Supose Ich muss eine Webanwendung implementieren, die eine hohe Anzahl gleichzeitiger Benutzer haben wird.

    Eine andere Sache, die ich hinzufügen möchte, wenn Sie es nicht messen können Sie es nicht schaffen. Ein guter Anfang würde definieren, was "hohe Anzahl von gleichzeitigen Benutzern" für Sie bedeutet?Ist das Facebook oder WhatsApp Art von Volume/Nebenläufigkeit? Definieren Sie diese zuerst, indem Sie mit Ihren Stakeholdern zusammenarbeiten (falls vorhanden), dann können Sie beginnen, Designentscheidungen zu treffen und Technologien auszuwählen.

    Ein guter Lackmustest beim Aufbau eines skalierbaren Systems ist die Frage: "Gibt es einen einzigen Fehlerpunkt?" Wenn ja, würde Ihr System nicht skalieren.

    0

    Wie ein anderer Benutzer vorgeschlagen; mit Redis ist eine vollkommen akzeptable Lösung für dieses Problem.

    Die lowdown davon ist der Dienst zum Speichern von Sitzungsobjekte zu verwenden und die Middleware nehmen lassen alles andere kümmern. Wie bereits erwähnt, ist es in den Fällen des Knotens Prozess Neustarten nützlich, Absturz usw. Speichern der Sitzungsdaten im Knoten Prozess birgt Risiken. Einer der Vorteile von Micro Services (wie Redis) ist, dass diese Risiken reduziert werden. Wenn Sie Express für Ihre Middleware verwenden, können Sie etwas verwenden, das Session store genannt wird. Es gibt viele Module, die diese Funktion nutzen.

    Ein solches Modul ist connect-redis

    Installation a Brise wie üblich:

    npm install connect-redis express-session 
    


    Dann würden Sie es wie so verwenden:

    var session = require('express-session') 
    var RedisStore = require('connect-redis')(session) 
    
    app.use(session({ 
        store: new RedisStore(options), 
        secret: 'keyboard cat' 
    })) 
    

    Jetzt verwenden Sie Ihre Session-Objekt, genau wie du normalerweise würdest. (req.session)


    Beispiele:

    Sitzungsinformationen eingestellt wird (von einer Form POST, zum Beispiel):

    req.session.email = req.body.email 
    


    Sitzungsinformationen abzurufen:

    console.log(req.session.email)