Dla regularnego czytelnika naszego bloga nie będzie zaskoczeniem jeśli napiszę, że często ostatnio „mamy głowy w chmurach”, a mówiąc poważnie, sporo u nas ostatnio technologii Cloud i związanych z nią warstw IaaS, PaaS i SaaS. W kontekście tych dwóch ostatnich chciałbym dziś przedstawić technologię, z którą eksperymentujemy od ponad pół roku i dziś chyba mogę już powiedzieć, że będziemy jej używać – mowa o Node.js.

O tym rozwiązaniu jest dość głośno od pewnego czasu, a zainteresowanie zarówno developerów, jak i światowych gigantów (Yahoo!, Microsoft) wydaje się rosnąć z miesiąca na miesiąc. Dla mniej wtajemniczonych wyjaśnię, że Node.js to Server-Side Javascript – tak, teraz już możemy napisać server w javascripcie.

Projekt ten powstał w 2009 jako hobbistyczny OpenSource, a dziś jest już profesjonalnie rozwijany zarówno przez niemałą społeczność, jak i firmę Joyent, która jest obecnie właścicielem większości praw związanych z tą technologią. Node.js został zbudowany w oparciu o silnik javascript-u V8 (Google), więc możemy spodziewać się ciągłego wzrostu wydajności wraz z zaostrzaniem się rywalizacji na rynku przeglądarek internetowych. Jak widać jest to technologia z dość silnymi fundamentami – niemniej o co tyle szumu?

Javascript – choć wielu może kojarzyć się z prostym językiem do skryptowania stron WWW – udowodnił, że jest świetnym narzędziem tworzenia aplikacji sterowanych zdarzeniami (event-driven programming), których od lat używamy w naszych przeglądarkach generując miliony kliknięć, naciśnięć, przesunięć etc. Największą zaletą tego podejścia jest fakt, że aplikacje tego typu działają asynchronicznie – wszelka komunikacja z „światem zewnętrznym” nie zatrzymuje działania aplikacji do czasu uzyskania odpowiedzi – aplikacja działa nadal i dopiero gdy otrzyma odpowiedź zacznie ją przetwarzać. To proste podejście, które stało się podstawą sukcesu tzw. AJAX-a – jest teraz dostępne po stronie serwera.

Gdy zastanowimy się nad tym nieco głębiej oznacza to, że Node.js dostarcza nam podstawę serwera z asynchronicznym I/O. Tym samym proste wielokrotne odpytanie baz danych nie jest już sekwencją kolejnych operacji – teraz wykonujemy je równolegle redukując tym samym czas komunikacji do najdłużej wykonującego się zapytania. Jest to dopiero początek potencjału drzemiącego w tej technologii. W czasie, gdy czekamy na odpowiedzi z baz danych, czy innych usług nasz serwer może bez przeszkód przyjmować kolejne połączenia i obsługiwać żądania. Daje to dramatyczny wzrost wydajności – a przede wszystkim pełniejsze i bardziej ekonomiczne wykorzystanie zasobów.

Proste testy wydajnościowe obrazują z czym mamy do czynienia: „usługa zwracająca aktualną datę” – testowane na maszynie wirtualnej (zasoby 1GB RAM-u z jednym rdzeniem procesora Core2 Duo E7600 3GHz ) z zainstalowanymi serwerami: Node.js, Apache + PHP oraz Apache + Python. Test zakładał 10000 próbek przy stu jednoczesnych żądaniach.

NodeJS, Apache, PHP, Python

Node.js obsługuje blisko 3900 r/s – dla porównania: PHP 430 r/s, Python 620 r/s.

Oczywiście, test ten nie oddaje całości zagadnienia, niemniej bardziej zaawansowane rozwiązania, nad którymi pracowaliśmy, również w testach wydajnościowych robią wrażenie np. dynamiczne (bez jakiegokolwiek cache-a) wygenerowanie pliku html o rozmiarze 25kb na podstawie szablonów – przy 100 jednoczesnych! żądaniach to blisko 40 r/s – znowu przytaczam tu wyniki przeciętnego komputera a nie maszyny serwerowej.

Node.js otwiera zupełnie nowy rozdział w życiu języka Javascript i chyba mogę zaryzykować stwierdzenie, że także w szeroko pojętym świecie usług. Potencjał tego rozwiązania i mnogości jego zastosowań dobrze obrazuje lista dostępnych już modułów. Nie bez znaczenia jest także to, iż Yahoo! dba by kolejne wcielenia YUI również współpracowały z Node.js. Osobiście wierzę, że technologia ta zostanie z nami dłużej pozwalając tworzyć szybsze, bardziej interaktywne i w pełni dynamiczne produkty.

Maciej Jastrzębski
projektant systemów informatycznych