Bycie SZYBKIM i radzenie sobie z dużą ilością ŁADUNKÓW to dwie różne rzeczy. Serwer, który naprawdę SZYBKO obsługuje jedno żądanie na sekundę, może całkowicie wykrzyczeć, jeśli wyślesz mu 500 żądań na sekundę (pod LOAD ).
Musisz także wziąć pod uwagę strony statyczne (i buforowane) vs. strony dynamiczne. Jeśli martwisz się o strony statyczne, to IIS prawdopodobnie pobije węzeł, ponieważ IIS używa buforowania w trybie jądra, co oznacza, że żądania, które żądają strony statycznej, nawet nie wyjdą z jądra.
Zgaduję, że szukasz porównania między ASP.NET i węzłem. W tej bitwie, po skompilowaniu / zinterpretowaniu wszystkiego, zapewne będziesz blisko wydajności. Może .NET jest trochę SZYBCIEJ, a może węzeł jest trochę SZYBCIEJ , ale prawdopodobnie jest wystarczająco blisko, żebyś się tym nie przejmował. Postawiłbym na .NET, ale nie jestem pewien.
Miejsce, w którym węzeł jest naprawdę przekonujący, to obsługa LOAD . Właśnie tam technologie naprawdę się różnią. ASP.NET poświęca wątek dla każdego żądania ze swojej puli wątków, a gdy ASP.NET wyczerpie się, wszystkie dostępne żądania wątków zaczynają się kolejkować. Jeśli obsługujesz aplikacje „Hello World”, takie jak przykład @shankar, może to nie mieć większego znaczenia, ponieważ wątki nie będą blokowane i będziesz w stanie obsłużyć wiele żądań przed Tobą zabrakło wątków. Problem z modelem ASP.NET pojawia się, gdy zaczynasz wysyłać żądania We / Wy, które blokują wątek (wywoływanie DB, wysyłanie żądania HTTP do usługi, odczytywanie pliku z dysku). Te żądania blokowania oznaczają, że Twój cenny wątek z puli wątków nic nie robi. Im więcej blokujesz,ZAŁADUJ swoją aplikację ASP.NET będzie mogła służyć.
Aby zapobiec temu blokowaniu, korzystasz z portów zakończenia we / wy, które nie wymagają trzymania wątku podczas oczekiwania na odpowiedź. ASP.NET obsługuje to, ale niestety wiele popularnych frameworków / bibliotek w .NET DON'T. Na przykład ADO.NET obsługuje porty zakończenia we / wy, ale Entity Framework ich nie używa. Możesz więc zbudować aplikację ASP.NET, która jest czysto asynchroniczna i obsługuje wiele obciążeń, ale większość ludzi tego nie robi, ponieważ nie jest to tak łatwe jak zbudowanie aplikacji synchronicznej i możesz nie być w stanie użyć niektórych swoich ulubionych części frameworka (jak linq do encji), jeśli tak zrobisz.
Problem polega na tym, że ASP.NET (i .NET Framework) zostały stworzone, aby nie wyrażać opinii na temat asynchronicznych operacji we / wy. .NET nie dba o to, czy piszesz kod synchroniczny czy asynchroniczny, więc decyzja należy do programisty. Częściowo dlatego, że wątkowanie i programowanie za pomocą operacji asynchronicznych było uważane za „trudne”, a .NET chciał, aby wszyscy byli zadowoleni (noobowie i eksperci). Stało się to jeszcze trudniejsze, ponieważ .NET skończył z 3-4 różnymi wzorcami wykonywania asynchronizacji. .NET 4.5 próbuje wrócić i zmodernizować platformę .NET, aby mieć uparty model wokół asynchronicznego We / Wy, ale może upłynąć trochę czasu, zanim frameworki, na których Ci zależy, faktycznie ją obsługują.
Z drugiej strony projektanci węzła dokonali zdecydowanego wyboru, że WSZYSTKIE I / O powinny być asynchroniczne. Z powodu tej decyzji projektanci węzłów byli również w stanie podjąć decyzję, że każda instancja węzła będzie jednowątkowa, aby zminimalizować przełączanie wątków, i że jeden wątek po prostu wykona kod, który został umieszczony w kolejce. To może być nowe żądanie, może to być wywołanie zwrotne z żądania DB, może to być wywołanie zwrotne z wysłanego żądania HTTP. Węzeł próbuje zmaksymalizować wydajność procesora poprzez wyeliminowanie przełączników kontekstowych wątków. Ponieważ węzeł dokonał tego zdecydowanego wyboru, że WSZYSTKIE we / wy są asynchroniczne, oznacza to również, że wszystkie jego frameworki / dodatki obsługują ten wybór. Łatwiej jest pisać aplikacje, które są w 100% asynchroniczne w węźle (ponieważ węzeł zmusza do pisania aplikacji, które są asynchroniczne).
Ponownie nie mam twardych liczb, które mogłyby udowodnić w ten czy inny sposób, ale myślę, że węzeł wygrałby konkurs LOAD dla typowej aplikacji internetowej. Wysoce zoptymalizowana (w 100% asynchroniczna) aplikacja .NET może dać ekwiwalent aplikacji node.js za swoje pieniądze, ale jeśli weźmiesz średnio całą platformę .NET i wszystkie aplikacje węzłowe, średnio węzeł prawdopodobnie obsługuje więcej ZAŁADUJ.
Mam nadzieję, że to pomaga.