Verbessert Node.js tatsächlich die Skalierbarkeit?

21

Ich habe über das C10K-Problem gelesen und insbesondere den Teil, der sich auf asynchrone Server-E / A bezieht. http://www.kegel.com/c10k.html#aio

Ich glaube, dies fasst ziemlich genau zusammen, was Node.js auf dem Server tut, indem es Threads ermöglicht, Benutzeranforderungen zu verarbeiten, während sie sich auf E / A-Interrupts (Ereignisse) verlassen, um Threads über abgeschlossene Jobs zu benachrichtigen, anstatt dass der Thread für den Thread verantwortlich ist voller CPU-Auftrag. Der Thread kann sich mit anderen Dingen auseinandersetzen (nicht blockieren) und benachrichtigt werden, wenn ein Auftrag erledigt ist (z. B. wenn eine Datei gefunden oder ein Video komprimiert wurde).

Dies bedeutet später, dass ein Thread mehr für Sockets und damit für Benutzer auf dem Server verfügbar ist.

Dann habe ich folgendes gefunden: http://teddziuba.com/2011/10/straight-talk-on-event-loops.html

Der Autor hier behauptet, dass das ereignisgesteuerte Framework (unterbrochenes Threading) zwar Threads freigibt, aber den Arbeitsaufwand einer CPU nicht wirklich verringert! Der Grund hierfür ist, dass, wenn ein Benutzer beispielsweise ein hochgeladenes Video komprimieren möchte, die CPU diesen Job noch ausführen muss und währenddessen blockiert (zur Vereinfachung sollten Sie hier die Parallelität außer Sie vergessen besser wissen!).

Ich bin ein unkomplizierter Programmierer, kein Serveradministrator oder ähnliches. Ich möchte nur wissen, ob Node.js ein Geschenk der Götter des Cloud Computing ist oder ob es nur heiße Luft ist und ob Unternehmen nicht durch die Verbesserung der Skalierbarkeit Zeit und / oder Geld sparen können.

Danke vielmals.

Alex
quelle
12
Erstens ist ted ein Troll, zweitens ist node.js für IO-gebundene Anwendungen gedacht, nicht für CPU-gebundene Anwendungen. Was Sie wollen, ist eine Kombination aus beiden. Alles, was an die CPU gebunden ist, geht in einen neuen Thread / Prozess. Alles, was an E / A gebunden ist, läuft in einer Ereignisschleife ab.
Raynos
1
+! Dieser Typ ist definitiv ein Troll.
Patrick Hughes
Es hängt davon ab, was Sie vergleichen - wenn Sie Apache (aus irgendeinem Grund) immer noch verwenden -, dann ist Node ein Geschenk der Götter, aber wenn Sie es mit Nginx vergleichen - sind die Verbesserungen viel weniger drastisch und Node ist noch langsamer. (Zehnmal langsamer, 2 ms gegenüber 20 ms, um eine Antwort zu generieren, ABER in unseren Tests gab Nginx 504 unter mäßig hoher Last und Node gab normale Antworten).
c69
Jetzt erwähnen Sie es, Leute, der Troll-Typ ist eindeutig ein Troll. @ c69 das ist eine gute Info, vielen Dank.
Alex
Ihr Link "Straight Talk on Event Loops" funktioniert nicht mehr.
Robert Harvey

Antworten:

20

Natürlich wird jede CPU-gebundene Arbeit die CPU nutzen. Es wird die CPU in jeder Sprache oder in jedem Framework blockieren, in dem Sie es schreiben.

Node.js eignet sich hervorragend für E / A-gebundene Aufgaben, nicht für CPU-gebundene Aufgaben. Ich würde in Node kein schweres Heben machen, obwohl das möglich ist. Node.js löst echte Probleme, keine fiktiven oder imaginären wie Fibonacci-Zahlenserver . Es ist keine „heiße Luft“.

Josh K
quelle
Wenn ich nur einige Benchmarks überprüfe, scheint es tatsächlich viel schneller zu sein, Seiten zu liefern : zgadzaj.com/… .. Ich denke, das war es, wonach ich gesucht habe ...
Alex,
3
@AlexW: Ein guter Punkt bei diesen Benchmarks ist, dass Sie im Wesentlichen statischen Inhalt bereitstellen. Sehen Sie mein Stück mit Millionen von Treffern pro Tag . Den PHP-Interpreter zu starten, ist Verschwendung. Schauen Sie sich so etwas wie Node-Static zum Bereitstellen von Dateiverzeichnissen an.
Josh K
@AlexW, nur um daran zu erinnern, dass zgadzaj.com/… node.js 0.1.103 verwendet, das jetzt alt ist !!
Samyak Bhuta
4

Während das C10K-Papier in Bezug auf Implementierungsdetails etwas veraltet ist, ist die ereignisbasierte Parallelität (das Reaktormodell) der präventiven Planung in gewisser Weise überlegen. Beispielsweise kann ein präemptives Planungsmodell Threads planen, während sie E / A-blockiert sind. Auf diese Weise können Node (und andere Tools wie Ruby's Event Machine und Python's Twisted) die verfügbaren Zyklen besser nutzen, indem sie mehr Zeit für echte Arbeit und weniger Zeit zum Blockieren aufwenden.

Rein Henrichs
quelle
-1

Multithreading steigert immer noch die Leistung. Die ursprüngliche Erklärung ist idiotisch, da die Existenz mehrerer Kerne nicht berücksichtigt wird. In dem Moment, in dem Sie mehr als einen Kern haben, sind Threads keine Threads mehr. Sie sind Hyperthreads. Jede threadintensive Anwendung wird von mehr als einer einzigen Thread-Anwendung profitieren.

aanand_ub
quelle
2
Dies erklärt jedoch nicht wirklich die Leidenschaft von Node.JS. Der Hauptvorteil von Node.JS besteht in der Fähigkeit, mehrere Anforderungen von einem einzigen Thread aus schnell zu verarbeiten und zu versenden, und nicht in der effektiven Verarbeitung schwerer Hintergrund-Workloads, auf die Ihre Antwort nicht zutrifft.
Robert Harvey
Der Hauptvorteil von node.js besteht darin, eine einzige Sprache für Front- und Backend zu haben. Alle diese anderen Behauptungen sind nur so, dass sie wichtiger erscheinen.
Whatsisname
2
@whatsisname Single Threaded Concurrency ist ein riesiger Vorteil, meiner Meinung nach viel größer als eine einzelne Sprache.
Bitte