Obrázok„JavaScript na servery? Si si istý?“ Tak to je častá otázka, ktorú počujem, ak niekomu prvýkrát poviem o NodeJS. NodeJS je totiž framework, ktorý umožnil jazyku rozšírenému v internetových prehliadačoch fungovať na strane servera. V tomto článku si povieme niečo o tom, čo to vlastne NodeJS je.

NodeJS je server, ktorý dokážete spustiť a on bude načúvať prichádzajúcim dotazom, a zároveň je runtime prostredie, ktoré poskytuje API umožňujúce vám realizovať rôzne úlohy serverovského typu. Je postavený na Single Event Loop a Non Blocking IO. To sú dva základné princípy, a preto si ich vysvetlíme trochu bližšie.

Single Event Loop znamená, že NodeJS v zásade beží len v jednom vlákne (je možné ho spustiť aj vo viacerých vláknach, ale to je skôr špeciálny prípad). Je to teda rozdiel oproti množstvu iných serverov, ktoré pre každú prichádzajúcu požiadavku spúšťajú samostatné vlákno, ktoré ju má obslúžiť. V NodeJS jedno vlákno obsluhuje všetky dotazy, ktoré na server prichádzajú. To znie ako strašne pomalý server, ktorý bude blokovať všetky ostatné dotazy, kým neobslúži ten jeden, ktorý prišiel ako prvý. Aby tomu tak nebolo, máme tu Non Blocking IO. To znamená, že NodeJS všetky operácie, ktoré trvajú dlho (čo sú v zásade operácie s databázou, súborovým systémom alebo sieťové operácie), vykonáva asynchrónne. To znamená, že to jedno vlákno nečaká za pomalými operáciami, ale vykoná svoj kód, spustí pomalú operáciu a začne obsluhovať ďalšiu požiadavku. Keď asynchrónna operácia skončí, NodeJS opäť vykoná kód, ktorý je reakciou na jej ukončenie a opäť sa venuje iným úlohám. Je to teda jedno vlákno, ktoré sa rýchlo a na krátku dobu prepína medzi rôznymi úlohami.

Otázka je, na čo je to vlastne dobré. Autori NodeJS tvrdia, že to má dve výhody:

  1. nízke nároky na pamäť servera,
  2. odpadá komplexnosť z paralelného vykonávania.

Jedno vlákno zaberá omnoho menej pamäte ako viac vlákien a keďže všetok kód sa vykonáva sekvenčne v jednom vlákne, tak neexistuje žiaden paralelizmus, ktorý by trebalo špeciálne riešiť.

Pre programovanie v NodeJS znamená táto architektúra dve veci:

  1. všetko je event-driven. Pri práci s NodeJS sa pripravte na prácu s callbackami,
  2. všetky akcie, ktoré trvajú dlho, treba vykonávať asynchrónne.

Ako som spomenul na začiatku, NodeJS obsahuje tiež sadu API, ktorá umožňuje vykonávať rôzne operácie relevantné pre prostredie servera:

  • HTTP – asi jedno z najpoužívanejších rozhraní. Umožňuje odpovedať na HTTP dotazy
  • I/O – práca so súbormi pomocou Streams a Buffers
  • DNS/URL – pomocné API na prácu s DNS a URL
  • Crypto – kryptografické operácie
  • Processes – interakcia s operačným systémom
  • Cluster – umožňuje spustiť NodeJS v clustri. To je prípad, kedy NodeJS beží vo viacerých vláknach
  • ďalšie…

Samozrejme nesmie chýbať spolupráca s databázami, ktorá je zastrešená NodeJS knižnicami pre jednotlivé databázy. To, že napojiť NodeJS na databázu by nemal byť problém, vyplýva aj z množstva knižníc pre tento účel, ktorý je možno nájsť na tejto (aj keď už neudržiavanej) stránke: https://github.com/joyent/node/wiki/modules#database

Hore vymenovaný zoznam predstavuje základnú množinu API. NodeJS je ale ľahko rozširovateľný a existuje pomerne veľké množstvo modulov (53 514 v tomto momente, aby som bol presný), ktoré je možné doinštalovať a používať. Aby ich inštalovanie a používani bolo jednoduchšie, bol vytvorený Node Packet Manager – skratka npm. Ten aj s jeho databázou balíkov je možné nájsť na adrese https://npmjs.org/.

Čo dodať na záver? NodeJS je server, ktorý si pomerne rýchlo našiel svoje miesto v IT svete. Medzi prehliadačovým klientom, ktorý rozumie JavaScriptu a rád komunikuje pomocou JSON, a novými NoSQL databázami, ktoré tiež obľubujú JSON, chýbal medzikus, ktorý by si s JavaScriptom a JSONom tiež dobre rozumel. NodeJS je presne ten medzikus, postavený na princípe Single Event Look a Non Blocking IO a zásobený pomerne veľkým množstvom modulov. Keďže je to mladý server, až čas ukáže, ako dobrý je to nástroj. Pre prípad, že vás NodeJS zaujal, tak už len linka, kde treba začať: http://nodejs.org/