NodeJS

Būtų keista jei nieko nebūtumėte girdėję apie šią naujai kylančią bangą programuotojų tarpe. Tai jau susiklostė, kad nuo šio pavasario teko kiek daugiau padraugauti su šia platforma. Todėl norėčiau pasidalinti įspūdžiais su Jumis. Taigi apie viską nuo pradžių, kodėl nodeJS?

Bevaikštant internete žiemos vakarais ir ieškant ką čia išbandyti – apsistojau ties puslapiu http://nodejs.org/. Greitai užmetus akį į example kodus, akivaidzdu, kad kažką apčiuopiamo pasirašyti galima itin greitai, o ir šiaip – JavaScript kalbą daugiau ar mažiau moka daugelis web programuotojų. Tad nieko nelaukus diegiame nodeJS į testinę mašina ir neilgai trukus jau kopijuoju example kodą ir … viskas kaip per sviestą. Nėra jokių neaiškių konfigūracijų ir neaiškių vietų dokumentacijoje iš serijos „čia ir taip aišku“.
Paskaičius atsiliepimų apie nodeJS galite susidaryti labai įvairias nuomones, mat daug teiginių tiek už nodeJS, tiek prieš, yra pakankamai argumentuoti. Galbūt tai kyla dėl to, kad euforijos apimti ir truputį nodeJS paragavę programuotojai šaukia, kad nodeJS gali viską, o oponentai mato kitaip ir/arba sprendžia kiek kitokius uždavinius. Tad svarbu suprasti, kur ir kada galima naudoti nodeJS. Jei galvojate, kad viskas greitai apsivers aukštyn kojomis – tai greičiausia teks nusivilti, bent porą metų kažko tokio tikrai neįvyks.
Viską pasvėręs aš nutariau nodeJS duoti šansą ir dalį kodo skirto, savo baigiamojam darbui universitete, rašiau su nodeJS. Ta dalis turėjo apkrauti kitą serverį(ius) http užklausomis ir išsaugoti informaciją duomenų bazėje apie gautą atsakymą ir laiką. Kadangi tokiu srauto generavimo mazgų yra keletas, todėl reikėjo duomenų bazę laikyti atskirai nuo jų. Duomenų apdorojimas ir siuntimas išoriniam serveriui užima šiek tiek laiko, todėl norėjau parašyti sistemą taip, kad kiek įmanoma labiau sumažinti išorinių serverių įtaką realiam rezultatui. Tik pradėjęs rašyti supratau, kad nodeJS tam kuo puikiausiai tinka. Mazgas gavęs komandą pradėti darbą paleidžia http užklausą į taikinį ir laukia atsakymo, jį gavęs iškarto paleidžia kitą http užklausą, o tuo tarpu kol laukia sekančio atsakymo – duomenis apdoroja ir siunčia į duomenų bazę. Žinoma gali susidaryti įspūdis, kad yra atliekami keli veiksmai tuo pačiu metu, tačiau tai tik iliuzija, kuri tiesiog leidžia išnaudoti CPU ir kitus resursus kol tarkime laukiame atsakymo iš išorinio serverio. O tas įspūdis tikrai geras, viskas sukasi žvėriškai greitai.
Dar vienas nusišypsoti leidęs dalykas, kad tarkime savo aprašytą logiką naršyklėje gali naudoti ir server-side, pavyzdžiui jei naudojate tokias bibliotekas kaip underscore, backbone ar panašiai – viską kuo puikiausia galėsite naudoti ir server-side, todėl sutaupysite daug laiko, nes nereiks vartyti dar vieno manual’o.
Kitas dalykas labai krentantis į akis – šiai dienai visokio plauko JS biliotekų pridygo it grybų po lietaus. Kažką sugalvojus yra nemaža tikimybė, kad tam jau yra parašyta biblioteka. Ta bibliotekų gausybė žinoma nėra blogai, bet – glumina. Kažką imti itin naujo yra pavojinga, nes nėra aišku ar projekto kūrėjui neišblės entuziazmas ir ar jis taisys pastebėtas klaidas. NodeJS turi bibliotekų registrą https://npmjs.org/ kuriame greičiausia rasite ko ieškote, tik svarbu atkreipti dėmesį į versijas. Jei prieš metus buvo įkelta paskutinė verija 0.2 tai yra dvi galimybės: projektas apleistas arba veikia puikiai 🙂
Kaip didžiulį privalumą aš laikau galimybę neprivilegijuotam sistemos vartotojui lokaliai įsidiegti reikiamas bibliotekas, kas gali būti kiek komplikuota su kitomis platformomis. Užtenka programuotojui sukurti failą package.json ir pasileisti komandą npm install. Viskas ko reikia bus suinstaliuota automatiškai į jūsų projekto node_modules katalogą, tad skirtinguose projektuose galite naudotis skirtingomis tų pačių bibliotekų versijomis.
Visgi nodeJS turi ir šiokių tokių trūkumų. Pavyzdžiui tai, kad nėra galimybės išnaudoti kelių branduolių procesorių, bet žinoma niekas netrukdo pasileisti kelis procesus ir paskirstyti srautą tarp jų. Šiai dienai bibliotekų leidžiančių lengvai paskirstyti srautą tarp procesų yra nemažai, belieka tik tinkamai pasirinkti arba pasirašyti savo. Ideja paprasta, paleidžiame kelis procesus kurie klausosi skirtingų portų ir pagrindinis procesas kuris klausosi tarkime 80 porto – atlieka reverse proxy vaidmenį. Tam puikiai tinka ir plačiai naudojamas NGinx, tik vienas niuansas, kad NGinx neveikia su socket.io. Bent jau kol kas. Kitas kliūnantis dalykas tai yra taip vadinamas „callback hell“, bet čia jau bėda tarp monitoriaus ir kėdės. Visgi taip tiesiog iš kart prisėdus greičiausia nepavyks visko susidėlioti tvarkingai, mat visi daugiau mažiau esame pratę prie sinchroninio programavimo, kai kodas vykdomas iš viršaus į apačią ir vienu metu atliekame vieną veiksmą. Tam šiaip irgi yra prigaminta bibliotekų, pavyzdžiui async.js.
Dar vienas nemalonus dalykas yra tai, kad nodeJS bet jau kol kas – keičiasi. Kas veikė tarkime su 0.6.x versija nebūtinai veiks ir su 0.8.x, tad skaitant dokumentaciją būtinai atkreipkite dėmesį į nurodomą stabilumo indeksą. Versijos išleidžiamos gana dažnai, tad norint rašyti „production ready“ kodą geriau palaukti 1.0.x versijos, nebent esate pasiryžęs sugriuvusius dalykus operatyviai šalinti arba nediegti naujų nodeJS versijų 🙂

Rekomenduoju pasižiūrėti žemiau pateiktą video, ten bus papasakota truputį apie V8 JavaScript varikliuko optimizacijas ir kaip tai atsiliepia greičiui.

Žygimantas

Lead developer at Soundest. Zend Certified Engineer.

More Posts - Website

Žymos: , ,

1 komentaras

Komentuoti: xeranas Atšaukti atsakymą

El. pašto adresas nebus skelbiamas.