Als FAST und Handhabung vieler LOAD sind zwei verschiedene Dinge. Ein Server, der wirklich SCHNELL eine Anfrage pro Sekunde bedient, kann völlig krächzen, wenn Sie ihm 500 Anfragen pro Sekunde senden (unter LOAD ).
Sie müssen auch statische (und zwischengespeicherte) und dynamische Seiten berücksichtigen. Wenn Sie sich Sorgen über statische Seiten machen, wird IIS wahrscheinlich den Knoten schlagen, da IIS das Kernel-Modus-Caching verwendet. Dies bedeutet, dass Anforderungen, die eine statische Seite anfordern, nicht einmal aus dem Kernel herauskommen.
Ich vermute, dass Sie nach einem Vergleich zwischen ASP.NET und Knoten suchen. In diesem Kampf werden Sie, nachdem alles kompiliert / interpretiert wurde, wahrscheinlich ziemlich nahe an der Leistung sein. Vielleicht ist .NET ein bisschen SCHNELLER oder der Knoten etwas SCHNELLER , aber es ist wahrscheinlich nah genug, dass es Ihnen egal ist. Ich würde auf .NET wetten, aber ich weiß es nicht genau.
Der Ort, an dem der Knoten wirklich überzeugend ist, ist für die Behandlung von LOAD . Hier unterscheiden sich die Technologien wirklich. ASP.NET reserviert einen Thread für jede Anforderung aus seinem Thread-Pool. Sobald ASP.NET alle verfügbaren Threads erschöpft hat, werden Anforderungen in die Warteschlange gestellt. Wenn Sie "Hello World" -Apps wie das Beispiel von @shankar bereitstellen, ist dies möglicherweise nicht so wichtig, da die Threads nicht blockiert werden und Sie viele Anfragen vor Ihnen bearbeiten können Fäden ausgehen. Das Problem mit dem ASP.NET-Modell tritt auf, wenn Sie E / A-Anforderungen stellen, die den Thread blockieren (Aufruf einer Datenbank, HTTP-Anforderung an einen Dienst, Lesen einer Datei von der Festplatte). Diese Blockierungsanforderungen bedeuten, dass Ihr wertvoller Thread aus dem Thread-Pool nichts tut. Je mehr Blockierungen Sie haben,BELASTUNG Ihre ASP.NET-App.
Um diese Blockierung zu verhindern, verwenden Sie E / A-Abschlussports, für die kein Thread gehalten werden muss, während Sie auf eine Antwort warten. ASP.NET unterstützt dies, aber leider viele der gängigen Frameworks / Bibliotheken in .NET NICHT. Beispielsweise unterstützt ADO.NET E / A-Abschlussports, Entity Framework verwendet diese jedoch nicht. Sie können also eine ASP.NET-App erstellen, die rein asynchron ist und viel Last verarbeitet. Die meisten Benutzer tun dies jedoch nicht, da dies nicht so einfach ist wie die Erstellung einer synchronen App, und Sie möglicherweise einige Ihrer Lieblingsteile nicht verwenden können des Frameworks (wie linq to entity), wenn Sie dies tun.
Das Problem besteht darin, dass ASP.NET (und das .NET Framework) so erstellt wurden, dass keine Meinung zu asynchronen E / A besteht. .NET ist es egal, ob Sie synchronen oder asynchronen Code schreiben. Daher ist es Sache des Entwicklers, diese Entscheidung zu treffen. Ein Teil davon ist, dass Threading und Programmierung mit asynchronen Operationen als "schwierig" angesehen wurden und .NET alle glücklich machen wollte (Noobs und Experten). Es wurde noch schwieriger, weil .NET 3-4 verschiedene Muster für die asynchrone Ausführung hatte. .NET 4.5 versucht, das .NET-Framework zurückzusetzen und nachzurüsten, um ein Modell für asynchrone E / A zu erhalten. Es kann jedoch eine Weile dauern, bis die Frameworks, die Ihnen wichtig sind, es tatsächlich unterstützen.
Die Designer von Node entschieden sich dagegen, dass ALLE E / A asynchron sein sollten. Aufgrund dieser Entscheidung konnten die Knotenentwickler auch die Entscheidung treffen, dass jede Instanz des Knotens ein einzelner Thread ist, um das Thread-Switching zu minimieren, und dass ein Thread nur Code ausführt, der in die Warteschlange gestellt wurde. Dies kann eine neue Anforderung sein, es kann sich um den Rückruf einer DB-Anforderung handeln, es kann sich um den Rückruf einer von Ihnen gestellten http-Rest-Anforderung handeln. Node versucht, die CPU-Effizienz zu maximieren, indem Thread-Kontextwechsel eliminiert werden. Da Node diese Meinung getroffen hat, dass ALL I / O asynchron ist, bedeutet dies auch, dass alle Frameworks / Add-Ons diese Auswahl unterstützen. Es ist einfacher, Apps zu schreiben, die zu 100% asynchron im Knoten sind (da der Knoten Sie zwingt, asynchrone Apps zu schreiben).
Auch hier habe ich keine harten Zahlen, die ich auf die eine oder andere Weise beweisen könnte, aber ich denke, Node würde den LOAD-Wettbewerb für die typische Web-App gewinnen. Eine hochoptimierte (100% asynchrone) .NET-App bietet der entsprechenden node.js-App möglicherweise einen Run für ihr Geld. Wenn Sie jedoch einen Durchschnitt aller .NET- und aller Node-Apps verwenden, verarbeitet der Knoten im Durchschnitt wahrscheinlich mehr BELASTUNG.
Hoffentlich hilft das.