Dlaczego do diabła miałbym używać Node.js? Samouczek dla każdego przypadku

Opublikowany: 2022-03-11

Wstęp

Rosnąca popularność JavaScript przyniosła ze sobą wiele zmian, a dzisiejsze tworzenie stron internetowych jest diametralnie inne. Rzeczy, które możemy obecnie zrobić w sieci z JavaScriptem działającym na serwerze, a także w przeglądarce, były trudne do wyobrażenia jeszcze kilka lat temu lub zostały zamknięte w środowiskach sandboxowych, takich jak Flash lub Java Applets.

Przed zagłębieniem się w rozwiązania Node.js warto zapoznać się z korzyściami płynącymi z używania JavaScript w całym stosie, który ujednolica język i format danych (JSON), umożliwiając optymalne ponowne wykorzystanie zasobów programistów. Ponieważ jest to bardziej zaleta JavaScript niż konkretnie Node.js, nie będziemy o tym tutaj dużo dyskutować. Ale jest to kluczowa zaleta włączenia Node do swojego stosu.

Jak podaje Wikipedia: „Node.js to spakowana kompilacja silnika JavaScript V8 firmy Google, warstwy abstrakcji platformy libuv i podstawowej biblioteki, która sama jest napisana głównie w JavaScript”. Poza tym warto zauważyć, że Ryan Dahl, twórca Node.js, miał na celu tworzenie witryn czasu rzeczywistego z funkcją push , „inspirowanych aplikacjami takimi jak Gmail”. W Node.js dał programistom narzędzie do pracy w nieblokującym, sterowanym zdarzeniami paradygmacie I/O.

Po ponad 20 latach bezstanowej sieci Web opartej na paradygmacie bezstanowej odpowiedzi na żądanie, wreszcie mamy aplikacje internetowe z dwukierunkowymi połączeniami w czasie rzeczywistym.

W jednym zdaniu: Node.js błyszczy w aplikacjach internetowych czasu rzeczywistego wykorzystujących technologię push nad gniazdami sieciowymi. Co jest w tym tak rewolucyjnego? Cóż, po ponad 20 latach bezstanowej sieci Web opartej na paradygmacie bezstanowej odpowiedzi na żądanie, wreszcie mamy aplikacje internetowe z dwukierunkowymi połączeniami w czasie rzeczywistym, w których zarówno klient, jak i serwer mogą inicjować komunikację, umożliwiając im swobodną wymianę danych . Stanowi to wyraźny kontrast z typowym paradygmatem odpowiedzi w sieci, w którym klient zawsze inicjuje komunikację. Dodatkowo wszystko opiera się na otwartym stosie internetowym (HTML, CSS i JS) działającym na standardowym porcie 80.

Można by argumentować, że od lat mamy to w postaci apletów Flash i Java — ale w rzeczywistości były to po prostu środowiska piaskownicy wykorzystujące sieć jako protokół transportowy dostarczany do klienta. Ponadto działały w izolacji i często działały na niestandardowych portach, które mogły wymagać dodatkowych uprawnień i tym podobnych.

Ze wszystkimi swoimi zaletami Node.js odgrywa obecnie kluczową rolę w stosie technologicznym wielu znanych firm, które polegają na jego unikalnych zaletach. Fundacja Node.js zebrała wszystkie najlepsze przemyślenia na temat tego, dlaczego przedsiębiorstwa powinny rozważyć Node.js w krótkiej prezentacji, którą można znaleźć na stronie Studia przypadków Fundacji Node.js.

W tym przewodniku po Node.js omówię nie tylko sposób, w jaki te zalety są osiągane, ale także dlaczego warto używać Node.js — i dlaczego nie — na przykładzie niektórych klasycznych modeli aplikacji internetowych.

Jak to działa?

Główna idea Node.js: użyj nieblokującego, sterowanego zdarzeniami I/O, aby pozostać lekkim i wydajnym w obliczu aplikacji czasu rzeczywistego intensywnie korzystających z danych, które działają na rozproszonych urządzeniach.

To jest kęs.

Tak naprawdę oznacza to, że Node.js nie jest nową platformą, która zdominuje świat tworzenia stron internetowych. Zamiast tego jest to platforma, która spełnia konkretną potrzebę.
Ćwierkać

Tak naprawdę oznacza to, że Node.js nie jest nową platformą, która zdominuje świat tworzenia stron internetowych. Zamiast tego jest to platforma, która spełnia konkretną potrzebę . A zrozumienie tego jest absolutnie niezbędne. Zdecydowanie nie chcesz używać Node.js do operacji intensywnie korzystających z procesora; w rzeczywistości użycie go do ciężkich obliczeń unieważni prawie wszystkie jego zalety. Węzeł naprawdę błyszczy w budowaniu szybkich, skalowalnych aplikacji sieciowych, ponieważ jest w stanie obsłużyć ogromną liczbę jednoczesnych połączeń o wysokiej przepustowości, co oznacza wysoką skalowalność.

Jak to działa pod maską, jest całkiem interesujące. W porównaniu z tradycyjnymi technikami obsługi sieci, w których każde połączenie (żądanie) tworzy nowy wątek, zajmując systemową pamięć RAM i ostatecznie wykorzystując maksymalną ilość dostępnej pamięci RAM, Node.js działa w jednym wątku, używając nieblokującego I/ O wywołaniach, co pozwala na obsługę dziesiątek tysięcy jednoczesnych połączeń utrzymywanych w pętli zdarzeń.

Schemat tradycyjnego wątku serwera w porównaniu z Node.js

Szybka kalkulacja: zakładając, że każdy wątek potencjalnie ma towarzyszące 2 MB pamięci, działanie w systemie z 8 GB pamięci RAM daje nam teoretyczne maksimum 4000 jednoczesnych połączeń (obliczenia zaczerpnięte z artykułu Michaela Abernethy'ego „Just what is Node .js?”, opublikowanej w IBM developerWorks w 2011 r. (niestety artykuł nie jest już dostępny) , plus koszt przełączania kontekstu między wątkami. Jest to scenariusz, z którym zwykle masz do czynienia w tradycyjnych technikach obsługi sieci. Unikając tego wszystkiego, Node.js osiąga poziom skalowalności ponad 1 mln jednoczesnych połączeń i ponad 600 tys. jednoczesnych połączeń websocket.

Istnieje oczywiście kwestia współdzielenia jednego wątku pomiędzy wszystkie żądania klientów i jest to potencjalna pułapka pisania aplikacji Node.js. Po pierwsze, intensywne obliczenia mogą zablokować pojedynczy wątek węzła i spowodować problemy dla wszystkich klientów (więcej na ten temat później), ponieważ przychodzące żądania byłyby blokowane do czasu zakończenia obliczeń. Po drugie, programiści muszą bardzo uważać, aby nie dopuścić do przepuszczania wyjątku do rdzenia (najwyższej) pętli zdarzeń Node.js, co spowoduje zakończenie działania instancji Node.js (skutecznie awarię programu).

Techniką używaną do unikania bąbelków wyjątków na powierzchnię jest przekazywanie błędów z powrotem do wywołującego jako parametry wywołania zwrotnego (zamiast wyrzucania ich, jak w innych środowiskach). Nawet jeśli jakiś nieobsługiwany wyjątek zdoła się rozrosnąć, opracowano narzędzia do monitorowania procesu Node.js i wykonywania niezbędnego odzyskiwania uszkodzonej instancji (chociaż prawdopodobnie nie będziesz w stanie odzyskać obecnego stanu sesji użytkownika). najczęstszym jest moduł Forever lub inne podejście z zewnętrznymi narzędziami systemowymi upstart i monit , a nawet po prostu upstart.

NPM: Menedżer pakietów węzłów

Omawiając Node.js, jedną rzeczą, której zdecydowanie nie należy pominąć, jest wbudowana obsługa zarządzania pakietami za pomocą NPM, narzędzia, które jest domyślnie dołączane do każdej instalacji Node.js. Idea modułów NPM jest bardzo podobna do Ruby Gems : zestaw publicznie dostępnych komponentów wielokrotnego użytku, dostępnych poprzez łatwą instalację za pośrednictwem repozytorium online, z zarządzaniem wersjami i zależnościami.

Pełną listę spakowanych modułów można znaleźć w witrynie npm lub uzyskać do niej dostęp za pomocą narzędzia npm CLI, które jest automatycznie instalowane wraz z Node.js. Ekosystem modułów jest otwarty dla wszystkich i każdy może opublikować swój własny moduł, który zostanie wymieniony w repozytorium npm.

Niektóre z najbardziej przydatnych obecnie modułów npm to:

  • express — Express.js — lub po prostu Express — inspirowany Sinatrą framework do tworzenia stron internetowych dla Node.js i de facto standard dla większości aplikacji Node.js dostępnych obecnie.
  • hapi - bardzo modułowy i prosty w użyciu framework zorientowany na konfigurację do tworzenia aplikacji internetowych i usług
  • connect — Connect to rozszerzalna platforma serwera HTTP dla Node.js, zapewniająca zbiór wysokowydajnych „wtyczek” znanych jako oprogramowanie pośredniczące; służy jako podstawa dla Express.
  • socket.io i sockjs — komponent po stronie serwera dwóch najpopularniejszych obecnie komponentów websocket.
  • mops (dawniej Jade ) - Jeden z popularnych silników szablonów, inspirowany HAML, domyślnym w Express.js.
  • mongodb i mongojs — opakowania MongoDB zapewniające API dla baz danych obiektów MongoDB w Node.js.
  • redis — biblioteka klienta Redis.
  • lodash (podkreślenie, lazy.js) - Pasek narzędzi JavaScript. Underscore zainicjował grę, ale został obalony przez jednego z dwóch odpowiedników, głównie ze względu na lepszą wydajność i modułową implementację.
  • na zawsze — prawdopodobnie najbardziej popularne narzędzie zapewniające nieprzerwane działanie danego skryptu węzła. Utrzymuje proces Node.js w środowisku produkcyjnym w obliczu nieoczekiwanych awarii.
  • bluebird - W pełni funkcjonalna implementacja Promises/A+ z wyjątkowo dobrą wydajnością
  • moment — biblioteka dat JavaScript do analizowania, sprawdzania, manipulowania i formatowania dat.

I tak dalej. Istnieje mnóstwo naprawdę przydatnych pakietów dostępnych dla wszystkich (bez obrazy dla tych, które tutaj pominąłem).

Przykłady zastosowań Node.js

CZAT

Czat jest najbardziej typową aplikacją działającą w czasie rzeczywistym, przeznaczoną dla wielu użytkowników. Od IRC (kiedyś), przez wiele zastrzeżonych i otwartych protokołów działających na niestandardowych portach, po możliwość implementacji wszystkiego dzisiaj w Node.js z websocketami działającymi na standardowym porcie 80.

Aplikacja do czatu jest naprawdę najlepszym przykładem dla Node.js: jest to lekka, intensywnie korzystająca z danych (ale o niskim przetwarzaniu/obliczeniu) aplikacja, która działa na rozproszonych urządzeniach. Jest to również świetny przypadek użycia do nauki, ponieważ jest prosty, ale obejmuje większość paradygmatów, których będziesz używać w typowej aplikacji Node.js.

Spróbujmy zobrazować, jak to działa.

W najprostszym przykładzie mamy jeden czat na naszej stronie internetowej, do którego ludzie przychodzą i mogą wymieniać wiadomości w sposób jeden do wielu (właściwie wszyscy). Załóżmy na przykład, że mamy na stronie trzy osoby, które są połączone z naszym forum dyskusyjnym.

Po stronie serwera mamy prostą aplikację Express.js, która implementuje dwie rzeczy:

  1. Moduł obsługi GET / żądań, który obsługuje stronę internetową zawierającą zarówno tablicę ogłoszeń, jak i przycisk „Wyślij”, aby zainicjować nowe wejście wiadomości, oraz
  2. Serwer websockets, który nasłuchuje nowych wiadomości emitowanych przez klientów websocket.

Po stronie klienta mamy stronę HTML z kilkoma skonfigurowanymi funkcjami obsługi, jedną dla zdarzenia kliknięcia przycisku „Wyślij”, która pobiera wiadomość wejściową i wysyła ją do gniazda sieciowego, a drugą nasłuchuje nowych wiadomości przychodzących na kliencie websockets (tj. wiadomości wysyłane przez innych użytkowników, które serwer teraz chce wyświetlić klientowi).

Gdy jeden z klientów opublikuje wiadomość, oto co się dzieje:

  1. Przeglądarka przechwytuje kliknięcie przycisku „Wyślij” przez moduł obsługi JavaScript, pobiera wartość z pola wejściowego (tj. tekst komunikatu) i emituje komunikat websocket za pomocą klienta websocket podłączonego do naszego serwera (zainicjowanego podczas inicjalizacji strony internetowej).
  2. Komponent połączenia websocket po stronie serwera odbiera wiadomość i przekazuje ją do wszystkich innych podłączonych klientów przy użyciu metody rozgłaszania.
  3. Wszyscy klienci otrzymują nową wiadomość jako wiadomość push za pośrednictwem komponentu po stronie klienta websockets działającego na stronie internetowej. Następnie pobierają treść wiadomości i aktualizują stronę internetową na miejscu, dodając nową wiadomość do tablicy.

Schemat gniazd sieciowych klienta i serwera w aplikacji Node.js

To najprostszy przykład. Aby uzyskać bardziej niezawodne rozwiązanie, możesz użyć prostej pamięci podręcznej opartej na sklepie Redis. Lub w jeszcze bardziej zaawansowanym rozwiązaniu, kolejka wiadomości do obsługi routingu wiadomości do klientów i bardziej niezawodny mechanizm dostarczania, który może obejmować chwilową utratę połączenia lub przechowywanie wiadomości dla zarejestrowanych klientów, gdy są oni offline. Ale niezależnie od wprowadzonych ulepszeń, Node.js nadal będzie działał na tych samych podstawowych zasadach: reagowanie na zdarzenia, obsługa wielu jednoczesnych połączeń i utrzymywanie płynności w doświadczeniu użytkownika.

API NA DOLE DB OBIEKTU

Chociaż Node.js naprawdę błyszczy w aplikacjach czasu rzeczywistego, to całkiem naturalne dopasowanie do ujawniania danych z obiektowych baz danych (np. MongoDB). Przechowywane dane JSON umożliwiają Node.js działanie bez niedopasowania impedancji i konwersji danych.

Na przykład, jeśli używasz Railsów, przekonwertujesz model JSON na modele binarne, a następnie pokażesz je z powrotem jako JSON przez HTTP, gdy dane są zużywane przez Backbone.js, Angular.js itp., a nawet zwykły jQuery AJAX wzywa. Dzięki Node.js możesz po prostu ujawnić swoje obiekty JSON za pomocą interfejsu API REST, aby klient mógł je wykorzystać. Ponadto nie musisz się martwić o konwersję między JSON a czymkolwiek innym podczas czytania lub pisania z bazy danych (jeśli używasz MongoDB). Podsumowując, można uniknąć konieczności wielu konwersji, używając jednolitego formatu serializacji danych na kliencie, serwerze i bazie danych.

WEJŚCIA W KOLEJCE

Jeśli otrzymujesz dużą ilość jednoczesnych danych, Twoja baza danych może stać się wąskim gardłem. Jak pokazano powyżej, Node.js może z łatwością obsługiwać współbieżne połączenia. Ale ponieważ dostęp do bazy danych jest operacją blokującą (w tym przypadku), wpadamy w kłopoty. Rozwiązaniem jest potwierdzenie zachowania klienta, zanim dane zostaną rzeczywiście zapisane w bazie danych.

Dzięki takiemu podejściu system zachowuje swoją responsywność przy dużym obciążeniu, co jest szczególnie przydatne, gdy klient nie potrzebuje jednoznacznego potwierdzenia pomyślnego zapisu danych. Typowe przykłady to: rejestrowanie lub zapisywanie danych śledzenia użytkowników, przetwarzane w partiach i nieużywane do późniejszego czasu; jak również operacje, które nie muszą być natychmiast odzwierciedlone (takie jak aktualizacja liczby „Lubię to” na Facebooku), gdzie ostateczna spójność (tak często używana w świecie NoSQL) jest akceptowalna.

Dane są umieszczane w kolejce za pomocą pewnego rodzaju infrastruktury buforowania lub kolejkowania wiadomości — takiej jak RabbitMQ lub ZeroMQ — i przetwarzane przez oddzielny proces wsadowego zapisu bazy danych lub usługi zaplecza intensywnie przetwarzające obliczenia, napisane na bardziej wydajnej platformie do takich zadań. Podobne zachowanie można zaimplementować w innych językach/frameworkach, ale nie na tym samym sprzęcie, o tej samej wysokiej, utrzymywanej przepustowości.

Schemat zapisu wsadowego bazy danych w Node.js z kolejkowaniem wiadomości

W skrócie: dzięki Node możesz odłożyć odpisy bazy danych na bok i zająć się nimi później, postępując tak, jakby się udało.

PRZESYŁANIE DANYCH

W bardziej tradycyjnych platformach internetowych żądania i odpowiedzi HTTP są traktowane jako pojedyncze zdarzenie; w rzeczywistości są to strumienie. Ta obserwacja może zostać wykorzystana w Node.js do zbudowania kilku fajnych funkcji. Na przykład można przetwarzać pliki, gdy są jeszcze przesyłane, ponieważ dane są przesyłane strumieniowo i możemy je przetwarzać w trybie online. Można to zrobić w przypadku kodowania audio lub wideo w czasie rzeczywistym oraz proxy między różnymi źródłami danych (patrz następna sekcja).

PEŁNOMOCNIK

Node.js można łatwo wykorzystać jako proxy po stronie serwera, gdzie może obsłużyć dużą liczbę jednoczesnych połączeń w sposób nieblokujący. Jest to szczególnie przydatne do proxy różnych usług o różnych czasach odpowiedzi lub zbierania danych z wielu punktów źródłowych.

Przykład: rozważ aplikację po stronie serwera komunikującą się z zasobami zewnętrznymi, pobierającą dane z różnych źródeł lub przechowującą zasoby, takie jak obrazy i filmy, w usługach chmurowych innych firm.

Chociaż dedykowane serwery proxy istnieją, użycie Node może być pomocne, jeśli twoja infrastruktura proxy nie istnieje lub potrzebujesz rozwiązania do lokalnego rozwoju. Rozumiem przez to, że możesz zbudować aplikację po stronie klienta z serwerem deweloperskim Node.js dla zasobów i żądań API proxy/stubingu, podczas gdy w środowisku produkcyjnym takie interakcje byłybyś obsługiwane za pomocą dedykowanej usługi proxy (nginx, HAProxy itp. .).

BROKERING - TABLICA ROZDZIELAJĄCA TABORA

Wróćmy do poziomu aplikacji. Innym przykładem, w którym dominuje oprogramowanie komputerowe, ale można je łatwo zastąpić rozwiązaniem internetowym działającym w czasie rzeczywistym, jest oprogramowanie transakcyjne brokerów, używane do śledzenia cen akcji, wykonywania obliczeń/analiz technicznych i tworzenia wykresów/wykresów.

Przejście na rozwiązanie internetowe działające w czasie rzeczywistym umożliwiłoby brokerom łatwe przełączanie stacji roboczych lub miejsc pracy. Niedługo możemy ich zobaczyć na plaży Florydy... albo na Ibizie... albo na Bali.

PANEL MONITOROWANIA APLIKACJI

Kolejny częsty przypadek użycia, w którym Node-with-web-sockets idealnie pasuje: śledzenie odwiedzających witrynę i wizualizacja ich interakcji w czasie rzeczywistym.

Możesz zbierać statystyki od użytkownika w czasie rzeczywistym, a nawet przenosić je na wyższy poziom, wprowadzając ukierunkowane interakcje z odwiedzającymi, otwierając kanał komunikacji, gdy dotrą do określonego punktu na ścieżce. (Jeśli jesteś zainteresowany, ten pomysł jest już produkowany przez CANDDi.)

Wyobraź sobie, jak mógłbyś ulepszyć swój biznes, gdybyś wiedział, co robią Twoi użytkownicy w czasie rzeczywistym — gdybyś mógł wizualizować ich interakcje. Dzięki dwukierunkowym gniazdom Node.js w czasie rzeczywistym, teraz możesz.

PANEL MONITOROWANIA SYSTEMU

Przyjrzyjmy się teraz stronie infrastruktury. Wyobraź sobie na przykład dostawcę SaaS, który chce zaoferować swoim użytkownikom stronę monitorowania usług, taką jak strona statusu GitHub. Dzięki pętli zdarzeń Node.js możemy stworzyć potężny internetowy pulpit nawigacyjny, który sprawdza statusy usług w sposób asynchroniczny i przesyła dane do klientów za pomocą gniazd sieciowych.

Za pomocą tej technologii można raportować statusy usług wewnętrznych (wewnątrz przedsiębiorstwa) i usług publicznych na żywo iw czasie rzeczywistym. Pchnij ten pomysł trochę dalej i spróbuj wyobrazić sobie aplikacje monitorujące Network Operations Center (NOC) u operatora telekomunikacyjnego, dostawcy usług w chmurze/sieci/hostingu lub jakiejś instytucji finansowej, wszystkie działające na otwartym stosie sieciowym wspieranym przez Node.js i gniazda sieciowe zamiast Java i/lub apletów Java.

Uwaga: Nie próbuj budować twardych systemów czasu rzeczywistego w Node (tj. systemów wymagających spójnych czasów odpowiedzi). Erlang jest prawdopodobnie lepszym wyborem dla tej klasy aplikacji.

Gdzie można używać Node.js

APLIKACJE INTERNETOWE PO STRONIE SERWERA

Node.js z Express.js może być również używany do tworzenia klasycznych aplikacji internetowych po stronie serwera. Jednak, o ile to możliwe, ten paradygmat żądanie-odpowiedź, w którym Node.js przenosiłby renderowany kod HTML, nie jest najbardziej typowym przypadkiem użycia. Istnieją argumenty za i przeciw takiemu podejściu. Oto kilka faktów do rozważenia:

Plusy:

  • Jeśli Twoja aplikacja nie ma żadnych obliczeń intensywnie korzystających z procesora, możesz ją zbudować w JavaScript od góry do dołu, nawet do poziomu bazy danych, jeśli używasz obiektu DB magazynu JSON, takiego jak MongoDB. To znacznie ułatwia rozwój (w tym zatrudnianie).
  • Roboty indeksujące otrzymują w pełni wyrenderowaną odpowiedź HTML, która jest znacznie bardziej przyjazna dla SEO niż, powiedzmy, aplikacja jednostronicowa lub aplikacja z gniazdami sieciowymi działająca na Node.js.

Cons:

  • Wszelkie obliczenia intensywnie wykorzystujące procesor zablokują czas reakcji Node.js, więc platforma z wątkami jest lepszym podejściem. Alternatywnie możesz spróbować przeskalować obliczenia [*].
  • Używanie Node.js z relacyjną bazą danych jest nadal dość uciążliwe (więcej szczegółów poniżej). Zrób sobie przysługę i wybierz dowolne inne środowisko, takie jak Rails, Django lub ASP.Net MVC, jeśli próbujesz wykonywać operacje relacyjne.
[*] Alternatywą dla tych obliczeń intensywnie korzystających z procesora jest stworzenie wysoce skalowalnego środowiska wspieranego przez MQ z przetwarzaniem zaplecza, aby utrzymać Node'a jako frontowego "urzędnika" do obsługi żądań klientów asynchronicznie.

Gdzie nie należy używać Node.js

APLIKACJA INTERNETOWA PO STRONIE SERWERA Z RELACYJNĄ DANYCH Z TYŁU

Porównując Node.js z Express.js z Ruby on Rails, na przykład, kiedyś była oczywista decyzja na korzyść tego drugiego, jeśli chodzi o dostęp do relacyjnych baz danych, takich jak PostgreSQL, MySQL i Microsoft SQL Server.

Narzędzia relacyjnej bazy danych dla Node.js były wciąż na wczesnym etapie. Z drugiej strony Railsy automatycznie zapewniają konfigurację dostępu do danych zaraz po wyjęciu z pudełka wraz z narzędziami obsługi migracji schematów DB i innymi klejnotami (zamierzona kalambur). Railsy i ich równorzędne frameworki mają dojrzałe i sprawdzone implementacje warstwy dostępu do danych Active Record lub Data Mapper.[*]

Ale wszystko się zmieniło. Sequelize, TypeORM i Bookshelf przeszły długą drogę, aby stać się dojrzałymi rozwiązaniami ORM. Warto również sprawdzić Join Monster, jeśli chcesz generować SQL z zapytań GraphQL.

[*] Jest możliwe i nierzadkie używanie Node'a wyłącznie jako front-end, przy jednoczesnym zachowaniu back-endu Railsów i łatwego dostępu do relacyjnej bazy danych.
Powiązane: Back End: Używanie Gatsby.js i Node.js do statycznych aktualizacji witryn

CIĘŻKIE OBLICZANIE/PRZETWARZANIE PO STRONIE SERWERA

Jeśli chodzi o ciężkie obliczenia, Node.js nie jest najlepszą platformą. Nie, zdecydowanie nie chcesz budować serwera obliczeniowego Fibonacciego w Node.js. Ogólnie rzecz biorąc, każda operacja intensywnie korzystająca z procesora anuluje wszystkie korzyści związane z przepustowością, jakie oferuje Node dzięki sterowanemu zdarzeniami, nieblokującemu modelowi we/wy, ponieważ wszelkie przychodzące żądania będą blokowane, gdy wątek jest zajęty przetwarzaniem liczby — zakładając, że próbujesz do uruchamiania obliczeń w tej samej instancji węzła, z którą odpowiadasz na żądania.

Jak wspomniano wcześniej, Node.js jest jednowątkowy i wykorzystuje tylko jeden rdzeń procesora. Jeśli chodzi o dodanie współbieżności na serwerze wielordzeniowym, zespół Node core wykonuje pewną pracę w postaci modułu klastra [ref: http://nodejs.org/api/cluster.html]. Możesz także uruchomić kilka instancji serwera Node.js dość łatwo za zwrotnym serwerem proxy za pośrednictwem nginx.

W przypadku klastrowania nadal należy odciążać wszystkie ciężkie obliczenia na procesy w tle napisane w bardziej odpowiednim środowisku i komunikować się za pośrednictwem serwera kolejki komunikatów, takiego jak RabbitMQ.

Nawet jeśli przetwarzanie w tle może być początkowo uruchamiane na tym samym serwerze, takie podejście ma potencjał do bardzo wysokiej skalowalności. Te usługi przetwarzania w tle można łatwo rozdzielić na oddzielne serwery robocze bez konieczności konfigurowania obciążenia serwerów internetowych skierowanych do przodu.

Oczywiście, użyjesz tego samego podejścia również na innych platformach, ale dzięki Node.js uzyskasz tak wysoką przepustowość żądań/s, o której mówiliśmy, ponieważ każde żądanie to małe zadanie obsługiwane bardzo szybko i wydajnie.

Wniosek

Omówiliśmy Node.js od teorii do praktyki, zaczynając od jego celów i ambicji, a kończąc na słodkich punktach i pułapkach. Kiedy ludzie napotykają problemy z Node, prawie zawsze sprowadza się to do faktu, że operacje blokujące są źródłem wszelkiego zła — 99% nadużyć Node jest bezpośrednią konsekwencją.

W Node operacje blokowania są źródłem wszelkiego zła — 99% nadużyć Node jest bezpośrednią konsekwencją.
Ćwierkać

Pamiętaj: Node.js nigdy nie został stworzony w celu rozwiązania problemu skalowania obliczeń. Został stworzony, aby rozwiązać problem skalowania I/O, co robi naprawdę dobrze.

Dlaczego warto korzystać z Node.js? Jeśli Twój przypadek użycia nie zawiera operacji intensywnie korzystających z procesora ani dostępu do zasobów blokujących, możesz wykorzystać zalety Node.js i cieszyć się szybkimi i skalowalnymi aplikacjami sieciowymi. Witamy w sieci czasu rzeczywistego.