Node.js Introducere – Sincron vs Asincron

În articolul anterior am făcut o scurtă paralelă între Thread-uri și Events; am precizat că modelul Evented are un loop principal și 2 componente: detectarea evenimentelor (event detection) și manipularea evenimentelor (event handlers).

De ce modelul evented este mai eficient pentru server?

În mare parte serverele sunt proiectate pt. I/O, ceea ce înseamnă că, în majoritatea timpului, așteaptă operațiile I/O (conexiune la server, accesarea unei baze de date, citirea unui fișier de pe HDD, comunicarea cu un serviciu web extern, etc).

Să luăm un exemplu: după ce a terminat de redactat cartea, una din damele din articolul anterior intenționează să o trimită editorului. Se conectează la www.paginalui.ro, face upload la PDF și apăsa submit.

Serverul editorului este programat să ruleze următoarea rutină:

  1. primește PDF-ul, salvează-l în folderul: /cărți_needitate/;
  2. salvează în baza de date autorul și datele personale;
  3. trimite notificare prin sms editorului;
  4. după salvarea fișierului trimite răspuns: „Material adăugat cu succes!”;

În modul sincron totul se execută în ordine, de sus până jos, fiecare pas fiind evaluat și procesat, iar utilizatorul primește răspunsul la finalizarea proceselor.

În modul asincron fiecare pas este evaluat, dar nu se așteaptă procesarea pașilor. Fiecare pas este procesat in paralel (în afara loop-ului principal), iar la finalizarea fiecăruia se întorc răspunsurile.

De aceea se poate observă că răspunsul pentru pasul ‘B’ s-a întors înaintea răspunsului pentru pasul ‘A’, deoarece procesarea lui a durat mai puțin.

Trimiterea mesajului prin SMS este mai rapida decat in modul sincron, deoarece că nu se asteaptă ca celelalte procese să termine.

Să zicem că serviciul extern nu a putut trimite SMS-ul și răspunde cu o întrebare “Reîncerc trimiterea?”, iar chestia asta se întâmplă de vreo 40 de ori.

În modul sincron utilizatorul așteaptă procesarea celor 40 de incercari apoi primeste răspunsul HTTP, altfel finalizarea execuției fișierului (ex: process.php) va înceta comunicarea cu serviciul extern de SMS.

În modul asincron, utilizatorul i se livrează răspunsul HTTP și în continuare serverul se va ocupa de trimiterea mesajului.

În Node.js toate operațiile sunt asincron, iar totul rulează în paralel, mai puțin codul tău!

Codul tău este evaluat și procesat în loop-ul principal, nu extern acestuia.

Spre exemplu, dacă se creează o funcție delay(1min) și este procesată în loop-ul principal, în acel interval de 1 minut, loop este blocat (implicit serverul).

În articolul următor vom începe să scriem primele linii de cod și deci..

Urmează: Asynchronous și Callbacks

Articol scris de Eugen Tudorancea

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

2 Comentarii to “Node.js Introducere – Sincron vs Asincron”

  1. Un mic spoiler, flow control cu Step (cum as implementa eu un astfel de exemplu):

    Step(
      function upload_carte_si_salvare_autor() {
        uploadeaza_cartea(this.parallel());
        salveaza_autor(this.parallel());
      },
      function trimite_sms(err, results) {
        if (err) {
          throw err;
          redirect_to(pagina_eroare_salvare_date);
        } else {
          trimite_sms(this);
        }
      },
      function raspuns_http(err , files) {
        if (err) {
          throw err;
          redirect_to(error_trimitere_sms);
        } else {
          redirect_to(afiseaza_pagina_succes);
        }
      }
    );
    

    Functiile pentru upload de carte si salvare date autor in baze de date se vor executa paralel.
    Daca acestea 2 reusesc, atunci se va trimite sms-ul, iar in cele din urma daca si acesta functioneaza ok se va face redirect la pagina cu succes.

  2. Alexandru Georoceanu

    Saau, cel mai bine – presupui ca toate au decurs cum trebuie (cum o si fac de obicei) si ii dai direct SMS cu ‘cartea a fost trimisa’.
    Daca totusi apare o eroare, ii dai imediat sms cu ‘editorul ti-a dat reject.’

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>

windows apple dropbox facebook twitter