2013-06-17 9 views
13

Verzeihen Sie meine Ignoranz, ich lerne derzeit, wie man Node aus einem PHP-Hintergrund, wo ich wirklich keine Interaktion mit Apache oder Server-Management hatte. Ich benutze Heroku, um meine Node-Projekte zu hosten, die direkt aus der Cloud9-IDE stammen.Node.js Child Prozesse auf Heroku mit einzelnen Dyno

Von dem, was ich gelesen habe, ist ein Heroku-Dyno ein einzelner Web-Prozess, der Kauf zusätzlicher Dynos ermöglicht es Ihnen, mit mehr eingehenden Verkehr umzugehen, weil Sie durch die Erhöhung von Dynos die Menge der Anfragen erhöhen können mit zu jeder Zeit.

Ich weiß, dass der Knoten ein single-threaded-System ist, das Anfragen einzeln behandelt, so dass Sie untergeordnete Prozesse für alles erstellen können, das einige Zeit dauern kann (wie Datenbankanforderungen, Verarbeitung von Dateien usw.).

Was passiert also in Heroku, wenn ich einen Child-Prozess mit einem einzelnen Prüfpunkt spawne? Braucht das keinen anderen Dyno, um daran zu arbeiten? Sicher, wenn Node einen einzigen Prozess ausführt und ich nur einen Prozess in meinem einzelnen Dyno verfügbar habe, müssen zusätzliche Prozesse auch von diesem Prozess gehandhabt werden?

Oder habe ich das alles falsch?

+1

Sie sollten keine separaten Knotenprozesse starten müssen, um Datenbankanforderungen und Dateiverarbeitung asynchron auszuführen. Dies ist nicht der Vorteil von nodejs. Wenn Sie eine nicht-deterministische Anzahl von Worker-Threads/-Prozessen erzeugen, verwenden Sie NodeJS absolut falsch. Und mit dieser Antwort glaube ich, dass Sie in der Lage sein sollten, Ihre eigene Frage zu beantworten. Wenn Sie mehr Details wünschen, lassen Sie es mich wissen! – ChrisCM

+0

Danke für Ihre Antwort, Chris. Ich habe mich vielleicht nicht richtig erklärt - meine Kenntnisse über Node reichen im Moment nicht zu weit außerhalb des Node Beginner Buches, in dem ein Beispiel 'var exec = require (" child_process "). Exec;' verwendet und verwendet später die "exec" -Funktion bei der Durchführung einer teuren Shell-Operation, um nicht blockierenden Code zu demonstrieren. So wie ich es verstehe, wird in diesem Beispiel die Shell-Operation auf einen anderen Prozess verschoben, so dass der Hauptprozess weiterhin neue Anforderungen annehmen kann und später einen Rückruf erhält, um die Antwort der ersten Anfrage anzuzeigen. – mibbler

+0

Ich habe meine Kommentare als Antwort eingereicht. – ChrisCM

Antwort

7

Ihr Verständnis von exec ist in etwa richtig, mein Anliegen ist, dass Sie es verwenden, wenn Sie dies nicht tun müssen ... In Ihrer Frage erwähnen Sie nur I/O Arten von Anwendungen, die Knoten sehr effizient innerhalb behandelt Es ist ein single-threaded Ereignismodell, Dinge zu tun. Obwohl das Ereignismodell single-threaded ist, ermöglicht es das Ausführen von Code, ohne die Hauptereignisschleife zu blockieren (es sei denn, Sie führen sehr CPU-intensive Operationen durch, von denen Datenbankanforderungen und Dateiverarbeitung nicht enthalten sind) Du musst keinen zusätzlichen Dyno starten, um das zu tun, was du willst.

Denken Sie an einen Prüfstand als Single-Prozessor-Computer. Was auch immer Sie auf einer Maschine mit einem einzigen Prozessor tun können, können Sie auf Ihrem Prüfstand tun, ohne zusätzliche Kosten oder erstellte Prüfstände. Ein Dyno hat zwar erheblich weniger Speicher, als ein einzelner Core-Prozessor-Computer nutzen könnte. Daher benötigen alle Subprozesse, die Sie spawnen möchten, keinen weiteren Dyno, auf dem sie laufen können. Jeder Master-Prozess, den Sie ausführen möchten, benötigt einen eigenen Dyno.

var http = require('http'); 

http.createServer(function (req, res) { 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('An amount of data that will take 1 second to send');//This will not block the event loop 
}).listen(1337, '127.0.0.1'); 

var http = require('http'); 
http.createServer(function (req, res) { 

    while(true) { 
     break after 1 second; //this will block the event loop for 1 second 
    } 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

Betrachten Sie die beiden Server im obigen Code. Beide Server haben ungefähr eine Sekunde Arbeit zu erledigen. Das erste Beispiel kann Tausende von Anfragen pro Sekunde bedienen, das zweite Beispiel nur 1. Das Senden von Daten, Datenbankanfragen, Serveranfragen, Datei-IO, usw. ... würde sich wie das erste Beispiel verhalten ... sehr wenige Dinge in Knoten verhalten sich wie das zweite Beispiel. Wenn Sie etwas haben, das unter das zweite Beispiel passt, ist es wahrscheinlich besser, eine andere Sprache auszuwählen, als zu versuchen, den Knoten zu zwingen, für einen Anwendungsfall zu arbeiten, für den er sehr schlecht entworfen ist.

+0

Oh, ok. So scheint es, dass ich Einzelprozess mit Einzelfaden verwechselte ..?Wissen Sie, ob die Anzahl der Prozesse, die ich auf einem Prüfstand ausführen kann, begrenzt ist? – mibbler

+0

Ich möchte Sie davon abraten, eine Fülle von Prozessen zu starten. Wenn Sie glauben, dass Ihr Knotenprozess das Starten von mehr als 1 oder 2 Arbeitern für einen Prozessor erfordert, verwenden Sie den Knoten wahrscheinlich nicht korrekt, oder Ihr Anwendungsfall wäre besser für eine andere Programmiersprache geeignet. Ich werde einen kleinen Demo-Code für dich schreiben. Davon abgesehen ist die Anzahl wahrscheinlich nur durch das Betriebssystem, das von Heroku benutzt wird, begrenzt, und nicht durch irgendwelche Einschränkungen, die sie auf Sie anwenden möchten. – ChrisCM

+1

Also Ihre wahre Begrenzung, ist wahrscheinlich RAM. Dynos kann 512 MB RAM unterstützen (zuletzt habe ich überprüft, was vor einer Weile war). Wenn Sie einen Prozess verzweigen, wird der Speicher dieses Prozesses in Ihre eigene Umgebung kopiert. Unter der Annahme eines 100-MB-Prozesses könnten Sie 5 solcher Prozesse generieren. (Die Mathematik hier ist nicht ganz genau, das ist nur eine Übersicht, Benchmarking könnte in Ordnung sein) – ChrisCM

Verwandte Themen