Czym różni się Node.js od innych frameworków po stronie serwera?

21

Zauważyłem, że Node.js stał się bardzo popularny i widziałem kilka przypadków ludzi wykonujących w nim małe projekty.

Przyjrzałem się również listom zalet i wad, aby dowiedzieć się, co potrafi Node.js, ale nadal nie jestem pewien, czym różni się od innych, bardziej dojrzałych technologii po stronie serwera, takich jak PHP, Perl lub Ruby na Szyny.

Co konkretnie odróżnia Node.js od obecnych alternatyw i dlaczego?

Saeed Neamati
źródło
1
@ downvoter - dlaczego downvote? z wyjątkiem drugiego akapitu (nie można tak naprawdę zapytać, dlaczego zacząć coś, gdy zrobił to ktoś inny, ponieważ zawsze można to zrobić lepiej), uważam to pytanie za intrygujące. Często o tym myślałem.
David Peterman,
Jest to drobna nitka do wyboru, ale jeśli użyjesz Google w cytowanym wyrażeniu „node.js” , otrzymasz około 3 milionów odsłon.
Peter Rowell,
@Peter, tak, próbowałem tego i masz rację. Ale 3 miliony to wciąż dwa. Możesz wrócić rok później, a liczba ta prawdopodobnie wzrosła do 10 milionów. :)
Saeed Neamati,
3
@ Mark, dziękuję za wybitną edycję. Teraz jest wyraźniej.
Saeed Neamati,

Odpowiedzi:

18

Są dwie ważne rzeczy, które odróżniają Node.js od istniejących frameworków po stronie serwera, zdarzenia asynchroniczne i użycie JavaScript jako języka programowania.

Zdarzenia asynchroniczne

Podczas gdy większość istniejących frameworków po stronie serwera wykorzystuje architekturę synchroniczną, Node.js używa architektury asynchronicznej , którą JavaScript może dobrze obsługiwać. Oznacza to, że serwer reaguje na zdarzenia i wysyła zdarzenia (wiadomości) np. Do bazy danych. Ten styl programowania różni się bardzo od stylu synchronicznego i może być trudny w użyciu w innych językach. Node.js stosuje styl asynchroniczny z asynchronicznym We / Wy i może dobrze skalować.

Zobacz także Architektura sterowana zdarzeniami

JavaScript

JavaScript jest językiem programowania używanym przez aplikacje internetowe na kliencie. Używanie tego samego języka po stronie serwera oznacza, że ​​programista może zastosować swoją wiedzę na temat języka JavaScript zarówno na kliencie, jak i na serwerze, i używać tych samych funkcji w razie potrzeby.

Poleciłbym prezentację Wprowadzenie do Node.js z Ryanem Dahlem, w której wyjaśnia on bardziej szczegółowo architekturę sterowaną zdarzeniami w Node.js.

Jonas
źródło
2
Jest to jak dotąd najlepsza odpowiedź, ale na pierwszym miejscu postawiłbym Zdarzenia asynchromiczne, ponieważ to właśnie sprawia, że ​​Node.js jest tak atrakcyjny jako platforma po stronie serwera. Dobra robota, wspominając o asynchronicznych we / wy i skalowalności. To jest sedno tego.
Adam Crossland,
Cóż, Jonas, nadal nie rozumiem. ASP.NET jest również oparty na zdarzeniach. Jaka jest zatem różnica między Node.js i ASP.NET? Czy tylko dlatego, że jest asynchroniczny? W takim przypadku myślę, że używanie wielowątkowości w ASP.NET może zrobić to samo, prawda?
Saeed Neamati,
3
@Saeed: Program ASP.NET jest wątkowy i synchroniczny, np. Podczas uzyskiwania dostępu do bazy danych wątek jest blokowany i oczekuje na odpowiedź z bazy danych. A przy użyciu wielu wątków (np. Jednego na żądanie) używana jest duża pamięć (każdy wątek wymaga dość dużej ilości pamięci), co może być wąskim gardłem. Node.js wysyła wiadomości i reaguje na zdarzenia, więc nigdy (miejmy nadzieję) nie blokuje wątku. W pliku node.js używasz tego samego modelu programowania, co po stronie klienta z Ajax ( javascript i XML asynchroniczny ), i tego samego języka.
Jonas,
Zapomniałeś o wielkiej społeczności Open Source.
Raynos,
3
Gdy C # 5 przetoczy się z nowymi asyncrzeczami, może się to zmienić. Problemem nie jest to, że nie można pisać skalowalnego kodu asynchronicznego w innych językach, jest to trudniejsze (poprawnie) bez dobrej obsługi języka.
Davy8
6

Jest inny, ponieważ jest sterowany zdarzeniami . Dzięki temu serwer jest wysoce skalowalny.

W skrócie;

Model wątku

  1. Klient prosi o coś
  2. Serwer wyłącza się i przetwarza żądanie
  3. Oddaje to klientowi
  4. Gotowy do przetworzenia nowego żądania

Model zdarzenia

  1. Klient prosi o coś
  2. Serwer przekazuje żądanie do przetworzenia. Gotowy do przetworzenia nowego żądania
  3. Serwer obsługuje więcej żądań w momencie ich wpłynięcia
  4. Serwer zwraca dane klientowi po zakończeniu przetwarzania żądania
Tom Squires
źródło
@Tom, co masz na myśli przez zdarzenia? ASP.NET WebForms jest również sterowany zdarzeniami i można zobaczyć programy obsługi takie jak Session_Startedlub Context_Authenticatedlub Page_Load?
Saeed Neamati,
1
Nazywanie go sterowanym zdarzeniami jest bardziej dwuznaczne niż to konieczne i tak naprawdę nie dociera do sedna Node.JS: asynchroniczne operacje we / wy.
Adam Crossland,
2

Odniosłem wrażenie, że jego popularność wynika z użycia JavaScript. Ponieważ wielu programistów zna JavaScript, warto sprzedać kod po stronie serwera przy użyciu tego samego języka. Ma to kilka zalet, o których mogę myśleć:

  • Pliki kodu mogą być współużytkowane między serwerem a klientem, zapobiegając powielaniu wysiłków tylko w celu obsługi dwóch stron systemu.
  • Programiści nie muszą mentalnie przełączać się między językami. (moim zdaniem nie jest to wielka sprawa)
  • Architekci nie muszą wybierać wielu języków podczas tworzenia rozwiązania internetowego.
  • Ktoś, kto nigdy nie opracował kodu po stronie serwera, może teraz to zrobić bez nauki innego języka. (Prawdopodobnie nie będzie to cenny argument, IMHO)
John Fisher
źródło
Node.JS jest popularny, ponieważ jest szybki i dobrze się skaluje. To, że jest w JavaScript, jest miłe, ale w dużej mierze przypadkowe.
Adam Crossland,
2
Bardziej cenne jest to, że programiści po stronie serwera mogą pisać kod po stronie klienta w tym samym języku i że można współużytkować moduły po stronie klienta z klientem. Nie na odwrót. Nie chciałbym przenosić zhakowanego kodu po stronie klienta na serwer, który strzela sobie w stopę.
Raynos
@Adam: Dlaczego node.js staje się popularny, skoro istnieją już technologie, które pasują do opisu „szybki i dobrze się skaluje”? - Ponieważ to JavaScript.
John Fisher
@John Trudniej jest pisać aplikacje, które nie skalują się dobrze w Node.js. Jeśli Twoja aplikacja wymaga dużej ilości dysku / sieci niż procesora (co w większości jest), możesz z łatwością obsługiwać wiele razy więcej jednoczesnych połączeń na jednym rdzeniu niż większość innych serwerów, chyba że napiszesz bardzo trudny kod wątkowy.
Davy8
@ Davy8: Myślę, że wszystko zależy od innych frameworków / systemów, z których korzystałeś. Łatwość skalowalności, którą opisujesz, jest już prosta dzięki narzędziom, których używam. Z mojego punktu widzenia jedyne, co oferuje Node.js, to smak JavaScript, który nie jest przekonujący.
John Fisher