Jak działa Node.js
Node.js to narzędzie, które umożliwia tworzenie i utrzymywanie skryptów w języku Javascript poza środowiskiem przeglądarki internetowej. Oznacza to, że możemy uruchamiać aplikacje javascript na komputerze, laptopie, czy serwerze i nie musimy do tego celu włączać przeglądarki. Ten szybki framework jest dostępny na wszystkich głównych środowiskach operacyjnych – Windowsie, Linuksie i MacOS.
Niewątpliwie jasnym punktem Node.js jest również npm, czyli Node Package Manager – narzędzie działające w command line, które daje programistom dostęp do potężnej biblioteki darmowych (open-source) modułów i bibliotek ułatwiających i przyspieszających tworzenie aplikacji.
Mówi się, że Node.js działa w systemie non-blocking w odróznieniu od np. zestawu PHP+Apache, który działa w systemie blocking. Innymi słowy: asynchronicznie i synchronicznie.
Pozwolę sobie wyjaśnić różnicę na przykładzie wizyty na poczcie w celu odebrania paczki, w której czynne jest jedno okienko.
Scenariusz 1, poczta działa w Apache + PHP
Taką właśnie pocztę, (którą każdy z nas zna i czasem – chętnie lub niechętnie – odwiedza) można porównać do serwera Apache z PHP. Podchodzimy do okienka, podajemy pani awizo. Jest to nasz request do serwera. Pani zabiera awizo i idzie na zaplecze w poszukiwaniu naszej paczki. Przez ten czas my stoimy przy okienku i cierpliwe czekamy, aż nasz request do serwera przyniesie wynik, czyli aż nasza pani z poczty przyniesie paczkę z zaplecza.
Poczta działa synchronicznie. Do momentu aż pani z okienka do nas wróci, działanie poczty jest zablokowane. Nie możemy wydać innego polecenia (np. kupić znaczek albo pocztówkę), pozostali klienci również czekają. Nie możemy zrobić nic innego, serwer wykonuje nasz request i wykona kolejny dopiero wtedy, gdy skończy aktualny.
Scenariusz 2, poczta działa w Node.js
Natomiast gdyby poczta była stworzona w Node.js, nasza wizyta przebiegłaby mniej więcej tak: Wchodzimy na pocztę, podchodzi do nas pani obsługująca klientów. Wydajemy jej prośbę (przekazujemy awizo). Pani zabiera awiso, ale wcale nie idzie na zaplecze szukać naszej paczki, ale przekazuje je asystentowi – magazynierowi, który przejmuje to zadanie. Natomiast pani na poczcie gotowa jest w tym momencie obsłużyć kolejną prośbę – którą np. jest kupno znaczka. I analogicznie, pani bierze od nas pieniądze na znaczek i przekazuje je kasjerowi, który teraz przejmie od niej zadanie odszukania znaczka w asortymencice, zaksięgowania wpłaty w kasie, przyszykowania reszty itp. Pani obsługująca klientów może w tym czasie obsłużyć kolejną prośbę.
Jak zauważyłeś, pani na poczcie w tym scenariuszu jest cholernie obrotna. Celowo nie piszę już 'pani z okienka’, bo pani nie ma czasu siedzieć w okienku. Biega od klienta do klienta, spełniając ich żądania.
Ale co z naszą paczką? Kiedy magazynier odnajdzie ją na zapleczu, przynosi ją do pani obsługującej klientów, a ona przekazuje ją nam. To obrazuje, dlaczego Node.js jest asynchroniczny. Poczta równolegle szukała naszej paczki (za sprawą magazyniera), a w międzyczasie obsługiwała inne prośby klientów.
Mam nadzieję, że to porównanie do poczty jest trafione i pomocne :). Jeszcze kilka słów podsumowania.
W założeniu, asynchroniczna poczta Node.js działa po prostu sprawniej niż synchroniczna poczta Apache. W powyższym porównaniu pani z okienka jest wątkiem serwera. Zatem zarówno Node.js jak i Apache (w domyśle, chociaż można go zmusić do innego trybu) działają w jednym wątku. Z tą róznicą, że Node.js działa asynchronicznie, a Apache synchronicznie. Chociaż dla wnikliwych, w przypadku Node.js mamy do czynienia z dwoma wątkami. W tym drugim, pobocznym wątku wykonują się działania magazyniera czy kasjerki przy kupowaniu znaczka, czyli instrukcje mające dziać się asynchronicznie, równolegle – tak aby główny wątek mógł w tym czasie nieprzerwanie robić coś innego. Generalne instrukcje wykonywane są przez jeden wątek, natomiast instrukcje asynchroniczne „przejmowane” są przez drugi wątek, który zwraca ich wynik do głównego wątku (paczka, znaczek). Wyniki układane są w kolejkę do tego głównego wątku (kto pierwszy ten lepszy), który zbiera je po kolei. Trochę więcej na ten temat znajdziesz w tym osobnym artykule na temat asynchronicznego Javascriptu.