2016-03-01 11 views
6

Mit Node.js-Servern, frage ich mich, ob es möglich und empfohlen ist, eine HTTP-Antwort von a delegierter Arbeitsprozess statt des Hauptprozesses. Diese Arbeitsprozesse können Node.js-Server selbst oder einfach Node.js-Kindprozesse sein, die über IPC kommunizieren."Direkte Antwort mit Node.js" - Senden von HTTP-Antwort mit verschiedenen Node.js-Prozess (anders als Hauptprozess)

Ich glaube nicht, das Cluster-Kernmodul https://nodejs.org/api/cluster.html kann tun, was ich tun möchte, weil in diesem Modell alle Arbeiter auf dem gleichen Port zuhören, und sie alle Anfragen im Auftrag des Master-Prozesses verarbeiten. Was ich suche, ist ein Haupt-Node.js-Prozess, der auf alle HTTP-Anfragen antwortet, vielleicht die Authentifizierung durchführt und einige Anfragen verarbeitet, aber auch in der Lage ist, datenintensive oder CPU-intensive Anfragen an einen Worker-Pool zu delegieren.

Stellen Sie sich vor, wir haben eine GET-Anfrage für eine große Datenmenge, sagen wir 2-3MBs.

Wir haben mindestens 3 mögliche Szenarien:

  1. der Hauptprozess empfängt die Anforderung, fragt die Datenbank für die große Menge an Daten und sendet dann die Daten an den Anforderer zurück.
  2. Hauptprozess empfängt die Anforderung, sendet einige Daten an einen Worker-Prozess mithilfe von IPC, der Worker ruft die Daten aus der DB ab, führt einige schwere Operationen aus, und dann sendet der Worker IPC, um alle 3MBs Daten an die Hauptkomponente zu senden Prozess, der dann die Antwort zurücksendet.
  3. Der Hauptprozess empfängt die Anforderung, sendet eine kleine Menge an Informationen über den Anforderungsstream an den Worker, der Worker erledigt die gesamte Arbeit und der Worker sendet die HTTP-Antwort zurück.

Ich bin besonders neugierig auf # 3 möglich machen. 3

Eine einfache Darstellung von Szenario ist unter:

enter image description here

(Nur um klar zu sein, ich will nicht mehr als 3 Antworten für eine Bitte, ich bin nur versuchen zu zeigen, dass ein Arbeitnehmer könnte möglicherweise senden Sie die Antwort im Namen des Hauptprozesses).

Wer weiß, wie dies mit Node.js funktionieren könnte? Wie könnte es in anderen Sprachen funktionieren? Normalerweise habe ich keine Probleme mit dem Node.js-Gleichzeitigkeitsmodell, aber mit einigen Arten von Daten ist die Verwendung des Cluster-Moduls wahrscheinlich nicht der beste Weg, die höchsten Nebenläufigkeitsgrade zu erreichen.

Ich glaube, ein Begriff für dieses Modell ist "direkte Antwort", was bedeutet, dass der Arbeiter direkt auf die Anfrage reagiert. Und vielleicht ist es möglich, hierfür einfach das Cluster-Core-Modul https://nodejs.org/api/cluster.html zu verwenden.

+0

Ich hatte eine ähnliche Idee vor nicht allzu langer Zeit, aber nach umfangreicher Suche endete ich mit Nginx als Load Balancer, die aussieht wie das, was Sie damit erreichen wollen, aber ohne die ganze App zu drehen. Ich würde mich auch für die Lösung interessieren, wenn jemand welche hat. – shriek

+0

sicher, danke, ich denke cluster.setupMaster könnte tun können, was ich will, aber ich bin mir noch nicht sicher, siehe: https://nodejs.org/api/cluster.html#cluster_cluster_setupmaster_settings –

+1

zum Beispiel, siehe die akzeptierte Antwort hier: http://stackoverflow.com/questions/23771516/using-cluster-in-a-node-module/24463511#comment59142347_24463511 –

Antwort

0

Ich frage mich, ob es möglich und empfehlenswert ist eine HTTP-Antwort von einem delegierten Arbeitsprozess

Ja zu senden, ist dies möglich und wahrscheinlich die einfachste gängigste Methode, Ihre Anwendungsserver zu skalieren . Anders als IPC kann es über Hosts hinweg über ein Netzwerk arbeiten. (Es funktioniert auch lokal, wenn Sie es wollen ... aber stellen Sie sicher, dass Sie tatsächlich CPU-gebunden in Ihrer Anwendung sind. Obwohl JavaScript selbst single-threaded ist, verwenden die meisten Bibliotheken für IO und einige NPM-Module Thread-Pools.)

Es gibt keinen Grund, Node zu verwenden.js als Server Lastenausgleich zwischen den Backend-Servern. Node.js ist besser für Ihren Anwendungsserver. Für etwas, das nur HTTP-Anfragen proxyt, würde ich Nginx oder ähnliches verwenden. Nginx kann den gesamten Umgang mit dem Client effizient abwickeln und kann leicht zum Lastenausgleich konfiguriert werden.

0

Wenn Sie versuchen, mehrere Prozessoren in der Maschine (n) (nur durch sich selbst ausführt Knoten verwendet einen einzigen Prozess) zu nutzen, verwenden Sie einfach PM2:

https://www.npmjs.com/package/pm2

PM2 verschiedene Instanzen Ihrer beginnt Anwendung auf den Prozessoren, die Sie an PM2 diktieren. Wenn Ihre Anwendung staatenlos ist (da sie idealerweise Knoten verwendet), wird auf jedem Prozessor eine Instanz Ihrer App ausgeführt, und PM2 übernimmt das Routing.

Wenn ich das Diagramm, das Sie für Szenario 3 gepostet haben, verbal neu zeichnen kann, würde PM2 den Platz von "MAIN" einnehmen und "W" würde durch Ihre App ersetzt werden und Sie müssen sich nicht um Worker und Forking kümmern.

Wir verwenden PM2 in der Produktion und es funktioniert gut für uns.

Verwandte Themen