Node.js Introducere – Thread-uri vs Evenimente

Într-un sistem complex, interacțiunea și colaborarea dintre componentele sistemului prezintă principalele structuri când este vorba de efciența. Web-ul (Internetul) este un sistem (global) complex de rețele, servere interconectate care folosesc un protocol (set de reguli) standard, TCP/IP. O persoană care utilizează un Browser comunică cu serverele printr-un alt protocol standard, HTTP.

Datorită evoluției rapide a web-ului și dorinței de comunicare în timp real, serverele HTTP sunt nevoite să evolueze. O soluție eficientă pentru îmbunătățirea comunicării (interacțiunii) dintre utilizator și server o prezintă Node.js – evented I/O bazat pe V8 – JavaScript engine-ul de la Google.

Thread vs Evented

Să luăm un exemplu: 3 persoane se conectează simultan la www.paginata.ro

Site-ul este hostat pe un server cu Apache2, PHP, Linux (LAMP).

Serverul HTTP (Apache2) preia conexiunile și deschide un thread pentru fiecare conexiune. Fiecare thread va rula o instanță a fișierului index.php, îl va evalua integral, de sus până jos (synchronous).

Acum partea importantă: un core al unui CPU nu poate rula mai mult de o instrucțiune odată, pur și simplu așa sunt proiectate. Deci core-ul unui CPU nu poate rula simultan instrucțiunile celor 3 instanțe ale fișierului index.php. Aici intervin thread-urile care împart instrucțiunile fișierelor în diviziuni de timp, ce vor fi procesate de un core.

Imaginați-vă 3 dame sofisticate care vor să scrie o carte, fiecare la aceeași mașină de scris. Simultan nu pot, dar împărțind paginile în diviziuni de timp, fiecare reușește să scrie câteva pagini, apoi cedează rândul și tot așa până se termină dactilografierea cărților.

Thread-urile prezintă o soluție deficitară pt. web, nu o să întru în detalii, cine este interesat poate citi: Threaded vs Evented Servers.

Reluăm exemplul: 3 persoane se conectează simultan la www.paginata.ro
Site-ul este hostat pe un server cu Node.js, Linux.

Serverul HTTP (Node.js) preia conexiunile și inițiază un eveniment (ex: “connected”) pt. fiecare conexiune, pe rând. Fiecare eveniment inițiază o serie de evenimente (asynchronous).

Pentru că un core (CPU) nu poate rula decât o instrucțiune odată, în orice moment din timp, un singur eveniment este procesat (dintr-o serie de evenimente).

Programarea evented (asynchronous) are un loop principal (Event loop) și prezintă 2 componente, detectarea evenimentelor (event detection) și manipularea evenimentelor (event handlers).

Browser-ele sunt Evented, prin urmare au un loop principal pt. detectarea evenimentelor. De aceea întâlnim sintaxa: onClick( afiseazaCeva ). Loop-ul principal detectează evenimentul “click” și rulează funcția “afiseazaCeva”, care este un event handler (callback).

NGINX™ si lighthttpd sunt event based ceea ce le face sa fie mult mai performante ca Apache2.

De ce Node.js?

1. JavaScript
Dacă vrei să scrii aplicații pt. web, inevitabil trebuie să înveți JavaScript și programarea pe evenimente. Datorită V8-ului JavaScript-ul pe server este o bestie!

Engine-ul V8 implementează ECMAScript (ECMA-262, 5th edition) (în prezent) este cel rapid VM pt. JavaScript (folosit și în Google Chrome).

Cei care sunt interesați să învețe JavaScript recomand:
JavaScript the Definitive Guide (a 6-a ediție) apoi JavaScript the Good Parts

2. Comunitatea
Proiectul are jur de 2 ani și jumătate și are 3000+ de module scrise. Nu toate sunt excelente, dar sunt open-source și poți să faci cam orice ai avea nevoie, chiar dacă vrei să-ți aprinzi lumina din cameră (serios vb).

3. Modulele / librăriile și NPM (Node.js Package Manager)

Un lucru foarte important pe care comunitatea a reușit să-l facă, este să creeze standarde. Cât de importante sunt standardele?! Limbajul este un standard, scrisul este un standard; nu am fi evoluat niciodată dacă nu reușeam să ne conformăm unor seturi de reguli acceptate în comunitate.

Mai sunt și alte lucruri importante dar ar fi articolul prea lung să le trec pe toate.

Urmează: Synchronous (Blocking) și Asynchronous (Non-Blocking)

Articol scris de Eugen Tudorancea

JavaScript Front-end developer/Server-side enthusiast Fondator navaru.ro

12 Comentarii to “Node.js Introducere – Thread-uri vs Evenimente”

  1. Eugen Tudorancea

    Ted Dziuba nu face parte din nici-un proiect major in development ca sa inteleaga ce implica deciziile care sunt luate.
    Ryan Dahl, creatorul proiectului Node.js nu este prea impresionat de JavaScript ca limbaj, el fiind programator C, dar a luat o decizie dupa ce a urmarit mai multi factori.
    Sa arati cu degetul unde este o problema e relativ usor, sa gasesti o solutie si sa o si implementezi, este foarte complex.

    “Everybody can tell you how to do it, but they never did it.”

  2. Fara numar, de la comunitatea Node.js pt Ted Dziuba: https://github.com/glenjamin/node-fib

  3. Daca Node.js e o solutie eficienta, (de ce nu) e folosit de _insert_web_titan_? (intreb, nu stiu)

    Alex, Ted revine cu un post mai acid:
    “Node.js is a danger to novice programmers.”
    http://www.teddziuba.com/2011/10/straight-talk-on-event-loops.html

  4. E folosit de _web_titan_ : github, linkedin, yahoo (experimental), facebook (experimental).

    Ex:
    http://venturebeat.com/2011/08/16/linkedin-node/
    http://www.readwriteweb.com/cloud/2011/05/nodejs-at-facebook.php

    Singurul lucru care ii retine pe altii sa adopte Node.js este faptul ca limbajul nu este inca atat de matur. Insa Erlang, EventMachine sau Twisted sunt de ex alte exemple de programare async care sunt folosite.

    Ted Dziuba are foloseste o logica tare ciudata, ceva de gen: exista accidente de masina, cum le eliminam? sa mearga toti cu 0 km/h.

    Node.js (care apropos NU ESTE UN WEB FRAMEWORK, cum mentioneaza Ted acolo), la fel ca si celelalte limbaje async (sau librarii) isi propune sa rezolve anumite probleme, nu totul. Cazuri de utilizare folositoare: real time web, file streaming, video encoding (pt mai mult vezi postul acesta -> http://blog.nodejs.org/).

    De ex in Node nu exista un framework atat de complet precum Rails sau Django (exista Express, care este un fel de Sinatra), dar nici nu a fost gandit pentru asta.
    Alt lucru pe care nu il poti face usor cu Node este sa creezi o baza de date.

    Ted e pur si simplu ignorant, cel mai bine o demonstreaza cu ultima replica: “It’s just f… JavaScript”.

    Da… e doar JavaScript:

    – cel mai raspandit limbaj din lume (e doar pe toate browserele)
    – e si server side (chiar de dinainte de Node au existat alte incercari)
    – e pe mobile (Titanium Appcelerator, PhoneGap folosesc HTML + JS)
    – desktop (Flex parca?)

    Cum a zis Isaacs: ce bine imi pare ca nu e pe mailing group, sa nu-i ascult bullshit-ul lui.

  5. Ah firar unde e butonul de edit, am vreo 2-3 (o)erori :D

  6. Acum înțeleg, mersi foarte mult de lămuriri și linkuri :)

  7. Mai adaug un avantaj pe care il are Node.js:

    – este un limbaj async complet, nu o librarie (cum e EventMachine sau Twisted de exemplu), la fel este si Erlang, asa ca nu exista pericolul sa incluzi ceva sync (blocking)

  8. Poate sunt eu mai greu de cap, dar chiar n-am inteles partea asta:
    “Nu te-ai săturat să observi că iar s-a murdărit la gură (Inna) de engleză și iar mai faci un hack/patch ca să este?”
    Parca nu se integreaza cu restul articolului … Nu am legatura cu web design-ul/devalopment-ul, daca se poate explicati pe intelesul meu.

  9. Eugen Tudorancea

    @morpheus ai dreptate, era o gluma proasta, post edited

  10. O prezentare foarte oky. Am inteles mult mai bine atat din articol cat si din commuri.

Show trackbacks

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>