Kaj je Node.js?

by Rok Bermež 24. May 2012 12:43

Node.js je zadnji izmed dolge vrste programskih jezikov, APIjev, toolkitov, ki se trudijo biti zadosti 'cool', da bi jih uporabljali. V tem smislu nadaljuje tradicijo Railsov, AJAXa, Hadoopa ter do neke mere tudi HTML5 hypea. Praktično je nemogoče najti kakršnokoli spletno orientirano konferenco brez vsaj kakšnega predavanja na to temo, ki bo večkrat kot ne, popolnoma zmedlo poslušalce.

Glede na to, da je tudi mene doletela ta čast, da bom na prihajajoči NT konferenci govoril o prav tej zadevi je smiselno, da se ji malce posvetimo tudi v Piki. Node.js, oziroma včasih zgolj Node, je strežniška rešitev za JavaScript oz. še bolj specifično, za prejemanje in odgovarjanje na HTTP zahtevke. Seveda se takoj pojavi vprašanje: Zakaj naj bi JavaScript poganjal karkoli izven brskalnika? Še posebej pa kar Strežnik ?!?

Prva zadeva, ki jo moramo vedeti je, da Node sicer poganja JavaScript, ni pa tudi sam JavaScript. Sestavlja ga Googlov V8 JavaScript pogon, libUV ter vrsta vključenih knjižnic in je namenjen pisanju skalabilnih internetnih aplikacij. Hitro lahko pomislimo, da JavaScript ni najbolj primeren za upravljanje z viri na sistemskem nivoju in imeli bomo prav. A glede na to, da sam Node ni JavaScript temveč C program kateremu JavaScript zgolj pošilja navodila za upravljanje s črno magijo APIja vašega operacijskega sistema. Dejstvo je, da je JavaScript današnjim spletnim programerjem precej bližje kot C, kar samo po sebi vpliva na resen pogled na Node, saj jim omogoča napisati strežnik, ne da bi jim bilo potrebo poznati C, oziroma kakšen drug jezik. Kot pri ostalih jezikih, bo tudi tu primeren ogled 'živjo svet' primera:

var http = require('http');

http.createServer(function (req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end('Živjo svet\n');

}).listen(1337, "127.0.0.1");

console.log(Strežnik teče na http://127.0.0.1:1337/');

S klicem 'require' naložimo zahtevan modul (ki jih pri node.js ne manjka in skupnost sproti dodaja nove), v našem primeru http modul v spremenljivko, iz katere smo naredili spletni strežnik. Pri tem smo strežniku podali funkcionalnosti, ki na vsak zahtevek zgolj nastavijo HTTP header ter vrnejo statično besedilo in nastavili specifičen port ter IP naslov, na katerem naj strežnik posluša.

Kako bomo poservirali več zahtevkov hkrati? Zelo enostavno, napisati nam ni treba prav nič dodatnega. Lepota Node.js je, da lahko s precej enostavnim in vsakdanjim JavaScriptov pridemo do teh rezultatov.

Klici funkcij v node.js so načeloma vedno asinhroni in določijo še 'callback' fukncijo, ki se bo izvedla ko bo klic končan, tako klicajoči niti ni treba čakati na rezultate temveč lahko vmes obdeluje druge zahtevke.

V klasičnem spletnem scenariju je komunikacija med spletnim strežnikom ter podatkovno bazo časovno najbolj zahteven del operacije. Node bo na vašem sistemu pustil manjši 'footprint' kot klasičen spleti strežnik in zaradi svoje asinhrone narave ne bo uporabljal virov med čakanjem na rezultat neke akcije. Tako na primer med klicem na podatkovno bazo, ki traja recimo 30 ms, ne čaka z alociranimi viri, temveč jih vmes uporabi za obdelovanje drugih zadev.

Poanta Node-a je tako, da je izjemno hiter, enostavno skalira in zaradi uporabe JavaScripta tudi precej enostaven za uporabo.

Ni pa srebrni metek, ki bi bil primeren za uporabo v vsakem scenariju. Med tem, ko se odlično obnese pri:

- dogodkovno orientiranih sletnih aplikacijah ki skalirajo čez več odjemalčevih povezavah

- na JSONu temelječih HTTP APIjih

- podatkovnih aplikacijah, ki uporabljajo isto kodo na strežniku in odjemalcu

se zaradi svoje 'interpreted' narave obnese nekoliko slabše pri zahtevnejših CPU operacijah.

Prav tako bi se dalo zagovarjati, da aplikacija, ki poleg svoje funkcionalnosti v sebi vsebuje tudi spletni strežnik podre 'razdeljevanje odgovornosti' in s tem prispeva k kompleksnosti njenega vzdrževanja. Na račun JavaScripta pa.... se najverjetneje ne najde mnogo ljudi, ki bi spodnjem delu kode pripisali simpatičnost:

if (typeof my_var !== "undefined" && my_var !== null) {

// neki, neki

}

Tako je Node.js zanimiva zadeva, vredna ogleda, a če ste sedaj veliko investirali v Microsoftove tehnologije, najbrž ne ponuja bistvene prednosti pred uporabo Async Controllerjev, MVC4 Web APIja ter SingalRja.

Tags:

Development

Add comment

Calendar

<<  May 2018  >>
MonTueWedThuFriSatSun
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar

Page List

Month List