Co je to Node.js a v čem je lepší než PHP?

Node.jsV první řadě bych chtěl uvést na pravou míru, že není pravda, že „programování v Node.js způsobuje rakovinu“ a ani není pravda, že „za každou appku v Node.js bůh zabije koťátko“. Obě fráze ale celkem trefně (a sarkasticky) vystihují odmítavý postoj vývojářů, se kterým se často setkávám, ač někdy ani nevědí, o co jde. Rozhodl jsem se tedy, že sepíšu pár větiček a dám do kupy, na co jsem při vývoji v nodeJs přišel a co by Vás mohlo a mělo zajímat.

NodeJs je javascriptové prostředí. Oproti PHP je velmi rychlé, událostmi řízené, neblokující a asynchroní. Co to vlastně znamená? Tradiční model aplikace v PHP funguje tak, že webový server (většinou Apache či nginx) poslouchá na nějakém portu. Když zachytí request, je vytvořen nový proces. Pak přijde na řadu PHP které vykoná náš kód tak, jak je napsaný „řádek po řádce“, provede všechny dotazy do databáze sekvenčně a nakonec pošle odpověď a uvolní proces a pamět. A to samé stále dokola pro každého návštěvníka.

Node to má trochu jinak. Poslouchání na portu je už součástí Vaší aplikace, tedy část Apache+PHP je zde vlastně sloučena. Uživatelé jsou zpracováni v jednom vlákně na základě událostí z čekací smyčky. Když si například načtu seznam článků z databáze, nemusím si pro každého uživatele znovu pro tyto data šahat, protože mohou tyto data sdílet a já mohu v aplikaci říct: „neptej se na další články, dokud nepřibude nový“.

Dále node umí, tak jak je pro javascript typické, používat asynchroní volání. Když operace trvá déle a nepotřebuji její výsledek pro pokračování, tak pracuji dál a odpověď zpracuji až se vrátí. Nemusím tedy dělat všechny dotazy do databáze sekvenčně, ale mohu poslat všechny dotazy „najednou“. Zpoždění způsobené načítáním dat z databáze tedy nebude součtem časů všech dotazů, ale bude se rovnat času nejdelšího z nich. Zde přichází na řadu často skloňované Promise. O tom ale až někdy jindy. Nepoužívání asynchroního volání může mít velmi špatné následky na rychlost celého systému. Jelikož je systém postaven na jedné smyčce událostí, běží pouze v jednom vlákně a používá pouze jedno jádro procesoru.

Používání pouze jednoho vlákna pro mě byl nejdříve docela šok, ale vyplývá to z toho, jak node.js funguje. Pokud máte čtyřjádrovou mašinu, ideální je použít nějaký způsob škálování (v AWS například ECS), který bude umět spouštět více instancí na různých jádrech a distribuovat mezi nimi traffic. Nebo můžete použít funkcionalitu přímo v node, cluster. Toto řešení mi přijde ale poněkud neobratné.

V článku o nodeJs je určitě důležité zmínit i nejrobustnější balíčkovací systém na světe NPM. Je to něco podobného jako composer v PHP. Umožnuje nám stahovat a používat v našem projektu knihovny třetích stran, protože node.js sám o sobě toho moc předpřipraveného nemá a hodně věcí byste museli programovat sami, stejně jako v samotném PHP bez frameworku (ať už je to Symfony, Zend či Nette). Pokud z nějakého důvodu nechcete, nebo nemůžete používat balíčky třetích stran, node nebude asi to pravé pro Vás. Jako balíček se dá v npm nalézt téměř cokoliv, co budete potřebovat. Já jsem si například oblíbil framework sails usnadňující vývoj aplikací (taková alternativa symfony). Pro instalaci balíčku stačí napsat

$ npm install sails

Další zajímavou věcí, kterou bych rád zmínil ohledně nodu, je možnost isomorfních aplikací. Isomorfní aplikace jsou takové, které sdílejí stejný kód na serveru a u klienta. Příkladem je kombinace node a react či node a angularJs. Všechno je to vlastně javascript. Pokud máte strach o SEO (google javascript myslím stále neindexuje), můžete nechat react renderovat na server-side. U angularu by to bylo značně složitější a museli byste využít služeb například prerender.io.

S čím jsem se sám ještě nezžil je psaní kódu. V nodu je třeba myslet a programovat jinak. Pravidla čistého kódu dle strýčka Boba (Uncle Bob) jsou těžko aplikovatelná, už jen kvůli tomu, že stojí na základech objektově orientovaného programování. Javascript ale klasické třídy a objekty nemá a i classy v novém standardu ECMA6 fungují trochu jinak. Přišlo mi, že si jejich dodržováním spíše hážu klacky pod nohy a frustrován začal sepisovat vlastní verzi těchto pravidel, která se budou pro javascript hodit více. Až je sepíšu a prověřím v praxi, určitě se o ně podělím.

A jak že je to s tím výkonem node.js a PHP? Dal jsem si tu práci a otestoval výkon v AB testu na small instanci v AWS (20000 requestů, 1500paralelně). Ve většině testů je na tom node.js nejlépe. Naopak mě překvapila pomalost Apache, v některých dalších testech se mi ho podařilo odvařit úplně.

nginx + php5fpm nodeJs apache2 + php5
1707.73 req/s 2424.37 req/s 1101.56 req/s
1703.55 req/s 2533 req/s 1098 req/s

Další testy naleznete na odkazech níže

http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php
http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *