ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 148
Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 56
Abonament PDF

Serverless Architecture

Bogdan-Alexandru Vlăduț
Java Developer @ Xoomworks



PROGRAMARE

În ultima perioadă se vorbește foarte mult despre serverless architecture. Aceasta pare să fie abordarea momentului pentru dezvoltarea software. În acest articol voi încerca să ofer o descriere a ceea ce înseamnă acest concept și voi oferi un exemplu concret de implementare utilizând serviciile de cloud furnizate de Amazon.

Ce înseamnă serverless architecture?

Voi încerca în următoarele rânduri să explic ce înseamnă acest nou concept prin plasarea sa în contextul de cloud computing actual. Imaginea de mai jos ilustrează modul în care serviciile cloud au simplificat procesul de dezvoltare a unei aplicații.

Acestea sunt principalele servicii puse la dispoziție de furnizorii de cloud computing:

În acest context serverless architecture ar putea fi considerat un nivel superior al PaaS. Cea mai importantă diferență constă în faptul că dispare în totalitate conceptul de server. Astfel, programatorul este responsabil să furnizeze codul ce trebuie executat, iar gestionarea mediului de execuție și scalabilitatea aplicației sunt asigurate automat. Ca idee generală, serverless architecture se referă la acea abordare în care codul e rulat în mod similar unei funcții a cărei execuții e declanșată de diferite evenimente (un request HTTP, un mesaj primit de la un alt sistem etc.). Nu există un server capabil să proceseze în mod continuu requesturile, astfel că funcția e încărcată și executată doar atunci când e nevoie. Voi utiliza în continuare termenul funcție pentru a numi acea bucată de cod executată ca reacție la un eveniment, aceasta fiind denumirea utilizată și în [1] (se utilizează chiar noțiunea de Function as a Service (FaaS)), iar cea mai avansată tehnologie în această direcție este AWS Lambda Function.

Serverless architecture permite programatorilor să se concentreze pe singura parte a aplicației capabilă să genereze profit: dezvoltarea de noi funcționalități. Celelalte niveluri sunt doar mijloace ajutătoare pentru a rula aplicația și a oferi utilizatorilor funcționalitățile de care au nevoie. În momentul în care poți face abstracție de celelalte niveluri (componentele hardware și mediul de execuție) și te poți concentra doar pe scrierea codului, atunci putem vorbi de serverless. Tot ce trebuie să faceți este să încărcați codul undeva, iar acesta e executat la momentul potrivit și alocarea de resurse suplimentare pentru a asigura scalabilitatea se realizează în mod automat. Această abordare vă poate ajuta să ajungeți foarte rapid de la idee la realizare pentru că nu aveți nevoie să pierdeți timpul cu configurări de servere sau instalarea unor componente hardware. Costul unor astfel de funcții este mai mic decât cel al execuției unor servere, deoarece costul implică doar resursele alocate pe durata execuției. Pe perioada în care aplicația nu recepționează niciun eveniment care să determine execuția unei funcții costul este zero.

Sună foarte promițător și probabil acesta e visul oricărui programator. Cu toate că cele expuse mai sus sunt adevărate, lucrurile nu sunt chiar atât de simple precum sunt adesea prezentate atunci când o nouă tehnologie iese la rampă. Chiar dacă nivelul de configurare necesar este mult mai redus față de modelele existente de dezvoltare, tot este necesar un aport semnificativ din partea programatorului pentru ca funcția să fie executată corect. O astfel de funcție reprezintă doar o secvență de cod, o parte a unei funcționalități a aplicației. Dar dacă nu e configurată corect, aceasta nu va fi executată niciodată. De asemenea, implementarea unei astfel de funcții trebuie să respecte un contract impus de furnizorul serviciului. Astfel va fi destul de greu ca acest cod să poată fi portat într-un alt mediu de execuție decât cel oferit de furnizorul serviciului de cloud. În plus, frameworkurile serverless actuale nu sunt încă mature, astfel că în cazul adoptării acestei abordări într-un proiect mai complex, trebuie realizată o analiză atentă.

Avantaje și Dezavantaje

Rezumând ideile anterioare, o aplicație serverless oferă mai multe avantaje:

Când e utilă abordarea serverless

Cu siguranță, această abordare nu este potrivită pentru orice tip de aplicație, astfel că e nevoie să urmărim câteva criterii pentru a decide dacă se potrivește cazurilor noastre de utilizare. Proiectul pe care lucrez folosește o abordare mixtă, în sensul în care majoritatea serviciilor sunt aplicații web ce rulează pe un server, însă există și numeroase funcții serverless. Iată câteva dintre cazurile în care utilizăm abordarea serverless:

Exemplu de implementare a unei aplicații serverless utilizând servicii Amazon

Pentru a vedea exact ce înseamnă dezvoltarea unei aplicații serverless, voi descrie în rândurile următoare un exemplu concret. Am ales un exemplu cât se poate de simplu pentru a utiliza doar servicii furnizate de Amazon care sunt cel mai des utilizate în dezvoltarea aplicațiilor serverless.

În acest scurt tutorial vom dezvolta o aplicație web care returnează al n-lea număr din șirul lui Fibonacci. Nu îmi propun să prezint aici fiecare pas din dezvoltarea aplicației pentru că astfel articolul ar deveni mult prea lung, însă sper să surprind punctele esențiale. Pentru informații mai detaliate despre fiecare serviciu Amazon vă sugerez să apelați la documentația oficială, care este foarte bine pusă la punct și vă pune la dispoziție multe exemple relevante.

Imaginea de mai jos surprinde structura generală a aplicației și interacțiunea dintre serviciile Amazon utilizate. Ca idee generală, accesând dintr-un browser URL-ul aplicației noastre se va încărca o pagină HTML care e stocată de serviciul S3. Din pagina HTML se realizează apeluri la un anumit endpoint REST definit cu ajutorul API Gateway. Acesta este configurat ca atunci când primește un request să apeleze mai departe serviciul Lambda pentru a calcula numărul căutat din șirul lui Fibonacci. Rezultatul este returnat pe același traseu pană la browser și este afișat utilizatorului. Parcurgând rândurile următoare veți avea o imagine mai clară asupra interacțiunii dintre serviciile Amazon descrise în această imagine.

Pe parcursul acestui exemplu, voi utiliza consola Amazon (interfața web pusă la dispoziție de Amazon pentru a interacționa cu serviciile). Există și alte posibilități de a interacționa cu serviciile Amazon (command line, Amazon SDK), însă aceasta este cea mai simplă și ne previne în a fi distrași de alte detalii irelevante în acest context.

Probabil cea mai simplă aplicație serverless la care ne putem gândi ar fi o aplicație web cuprinzând doar pagini statice HTML. În dezvoltarea aplicației noastre vom începe de la acest nivel construind o aplicație AngularJS foarte simplă. Interfața grafică este cea din imaginea alăturată, însă nu vă voi plictisi cu cod pentru că ceea ce face poate fi găsit în orice tutorial de AngularJS pentru începători.

Pentru a face accesibilă această pagină HTML, fișierul va fi stocat cu ajutorul serviciului S3. Acesta este un serviciu de la Amazon pentru stocarea fișierelor, dar poate funcționa și în calitate de Content Delivery Network (CDN). Pentru a realiza acest lucru este nevoie să creăm un bucket și să încărcăm fișierul HTML la această localizare. În mod automat se va genera un URL ce poate fi accesat direct din browser.

Următorul serviciu pe care îl vom utiliza este AWS Lambda Function. Acesta este un serviciu capabil să ruleze o secvență de cod într-un context specificat: ca urmare a interceptării unor evenimente (de exemplu, încărcarea unui fișier în S3 poate declanșa execuția unei funcții Lambda); ca urmare a unui request HTTP; invocarea în mod direct a unei funcții prin intermediul unui API pus la dispoziție de Amazon.

Navigând la pagina de configurare a serviciului AWS Lambda Function o nouă funcție va fi creată prin specificarea numelui funcției și furnizarea codului ce va fi executat. Există mai multe modalități pentru furnizarea codului: inline, prin introducerea codului în interfața Web; încărcarea unei arhive zip conținând codul și dependințele; introducerea unei referințe la un fișier stocat în S3. Am ales prima variantă pentru că e cea mai simplă și în acest caz nu avem nevoie de o altă abordare. Pentru o funcție Lambda se va specifica un handler (în imaginea de mai jos handlerul este dat de funcția exports.handler) ce va fi apelat atunci când este invocată funcția. Handlerul trebuie să respecte anumite convenții, lucru valabil pentru toate limbajele suportate de AWS Lambda. Conform documentației, limbajele de programare disponibile sunt: Node.js (JavaScript), Python, Java (compatibil cu Java 8) și C#. Pentru acest exemplu am ales Node.js. După creare, tot prin intermediul interfeței web, noua funcție poate fi testată apelând-o cu diferiți parametri. În acest moment avem o funcție implementată conform așteptărilor, însă codul scris de noi nu va fi executat niciodată.

exports.handler = (event, context, callback) => {
    if(event.number === undefined) {
        callback("No number provided.");
    } else if(typeof event.number !== "number") {
        callback("The provided number is"+
        " invalid.");
    } else 
        if(event.number < 1 || event.number > 1000) {
      callback("Please provide a number"+
        " between 1 and 1000.");
    } else {
        callback(null, fibonacci(event.numer));
    }
};

function fibonacci(n) {
    return n < 2 ? n : (fibonacci(n-1) + fibonacci(n-2));
}

Ultimul pas în dezvoltarea aplicației propuse este dat de crearea unui endpoint REST care să execute funcția definită anterior. Acest lucru se realizează cu ajutorul serviciului API Gateway. Definirea unui nou endpoint poate fi realizată tot prin intermediul consolei AWS. Din interfața serviciului API Gateway va fi creat mai întâi un nou API, iar în cadrul acestei componente se definește endpointul GET "/numbers/{number}", unde {number} reprezintă un placeholder pentru numărul furnizat de clientul endpointului. Acesta va fi furnizat mai departe ca parametru pentru funcția Lambda anterior definită.

Concluzii

Așa cum am văzut în acest articol, serverless este o versiune mai avansată a PaaS, în sensul în care programatorii nu mai trebuie să se concentreze pe configurarea mediului de execuție și scalarea aplicației, aceste facilități fiind furnizate în mod automat. Arhitectura de tip serverless este încă într-o fază de început, însă dezvoltarea este accelerată și este de așteptat ca noi soluții să apară în perioada următoare. Cu toate că există o serie de dezavantaje asociate acesteia, totuși pot fi găsite numeroase cazuri de utilizare pentru care serverless este abordarea cea mai potrivită.

Am încercat apoi să vă arăt ce presupune dezvoltarea unei aplicații serverless utilizând serviciile de la Amazon. Chiar dacă am omis mulți pași din acest proces pentru a păstra articolul cât mai scurt cu putință, sper că v-ați putut face o idee și că v-am stârnit curiozitatea pentru a încerca o implementare proprie. Pentru mai multe detalii, vă sugerez să apelați la documentația oficială. De asemenea, aici puteți găsi cel mai detaliat articol pe care l-am citit până acum despre serverless architecture.

Bibliografie

În aceeaşi ediţie ... (56)

▼ TOATE ARTICOLELE ▼

Conferință TSM

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects

Bogdan-Alexandru Vlăduț a mai scris