TSM - Serverless computing folosind Azure Functions

Denis Salanța - Development Manager @ VE Interactive


Chiar de la începuturile industriei software, aplicațiile dezvoltate trebuiau să fie găzduite undeva pentru a putea fi executate.

Aplicațiile business erau găzduite pe un server, unde funcționau atât timp cât era nevoie de ele.

Pentru a face mentenanța și a oferi suport tehnic acestor servere, au fost create departamente noi, facilitând funcționarea lor într-un mod optim. Serverele trebuie funcționeze neîntrerupt, iar în cazul în care se identifică o problemă în operarea lor, să fie pregătit un plan de backup prin care aplicațiile să continue a fi executate așa încât activitatea de business să nu fie afectată.

Cu timpul, capacitățile fizice ale serverelor care găzduiau aplicațiile s-au îmbunătățit considerabil, concomitent cu dezvoltarea tehnologiilor de virtualizare care deveneau tot mai performante, ajungând astfel la posibilitatea rulării mai multor sisteme de operare guest (denumite și mașini virtuale) pe același server.

Astfel, odată cu creșterea numărului de mașini virtuale folosite, s-a mărit și costul operațional al hardware-ului gazdă și al sistemelor de operare oaspete: găzduirea, întreținerea și actualizarea.

Aceasta a fost perioada serverelor găzduite pe hardware în incinta companiei (on-premise) sau în colocație cu alte servere gestionate de un furnizor de servicii de găzduire, unde aplicațiile și serviciile trebuiau să funcționeze cât timp era nevoie de ele.

În ultima perioadă, odată cu rapida creștere a diferitelor businessuri, nevoie de scalare a aplicațiilor și serviciilor a devenit tot mai stringentă.

Corelat cu dezvoltarea afacerilor, se măresc și costurile de achiziție si întreținere a serverelor găzduite local.

În acest context, infrastructura bazată pe cloud s-a dovedit a fi calea de înaintare. Companii precum Amazon prin serviciul Amazon WebServices, Microsoft prin tehnologia Azure sau Google prin Compute Engine, au construit centre de date în preajma punctelor importante ale globului, oferind astfel posibilitatea businessurilor să își execute aplicațiile la o scară nemaivăzută. Majoritatea companiilor în ziua de azi, realizează efortul de migrare către o platformă ce oferă servicii IaaS (infrastructură ca serviciu).

Atunci când e nevoie sau se dorește, pornirea serverelor realizată de infrastructura cloud ajută businessul în a depăși limitările de găzduire în servere locale ale furnizorilor de servicii.

Următorul nivel de abstractizare a tehnologiei de găzduire a severelor este platforma ca serviciu (PaaS - platform as a service). Pentru a ajuta businessurile în a nu fi ocupate cu actualizări de sisteme de operare sau de infrastructură, pe piață au apărut furnizori de servicii PaaS.

Există numeroase variante de servicii PaaS, cum ar fi baze de date, autentificare sau chiar aplicații oferite ca un serviciu. În cadrul acestor platforme, ți se oferă posibilitatea configurării unor variabile precum opțiunile de scalare și conectarea către terțe dependențe așa încât printr-o simplă configurare businessul să dețină anumite beneficii care ar fi costat săptămâni de dezvoltare pentru a fi implementate și lansate în producție.

Cu toate acestea, pentru a lansa un nou serviciu web, luând ca exemplu un endpoint HTTP, ar trebui ca respectiva aplicație să fie scrisă într-un mediu de dezvoltare local, apoi să se efectueze pașii necesari pentru a pregăti codul de a fi executat într-un mediu de producție. Toate acestea, fără a uita de implementarea mecanismelor de dirijare a cererilor, a autentificării sau a autorizării cererilor către endpointul dorit a fi expus.

În alți termeni, oare nu ar fi mai bine ca o companie să fie interesată de scrierea logicii care deservește funcționarea businessului?

Aici e momentul în care intervine serverless, care nu ține doar de abstractizarea serverelor pe care rulează codul, deoarece lucrul acesta este acoperit deja de serviciile PaaS. Lucrul pe care serverless îl aduce în plus e, eliminarea noțiunii de server de aplicații, cum ar fi: Apache, nginx sau IIS.

Astfel, codul care descrie logica dorită de business și care reacționează la diferite evenimente cum ar fi inserarea unui rând nou într-o tabelă sau a unui mesaj nou într-o coadă sau un rând nou într-un fișier Excel, poate fi scris într-o manieră cu adevărat serverless.

Ce este Serverless?

Termenul serverless este un termen impropriu, deoarece nu poți avea o aplicație serverless fără a fi până la urmă găzduită pe un server.

Fiind un termen nou inventat, voi folosi o definiție enunțată de Martin Fowler, în care el definește arhitectura serverless ca fiind:

[..] aplicații care depind în mod deosebit de servicii oferite de terți (supranumite si Backed as a Service sau "BaaS") sau depind de un cod sursă care este executat în containere temporare (Function as a Service or "FaaS")

Se pot identifica două tipuri de arhitecturi serverless:

BaaS - Aceasta a fost prima aplicare a termenului de arhitectură serverless, înțelegând aplicații complexe care se conectează la baze de date accesibile prin internet, precum Parse, Auth0.

FaaS - Execuția logicii aplicației, fără a avea grija configurării sau administrării unor servere de găzduire sau a serverelor de aplicații, pe containere stateless și invocarea pe bază de evenimente. Amazon oferă servicii FaaS prin AWS Lambda, Microsoft prin Azure Functions și Google prin Cloud Functions.

Cum se diferențiază o arhitectură tradițională față de o arhitectură serverless?

O aplicație client tradițională bazată pe trei nivele, arată de obicei în felul următor:

În imaginea de deasupra observăm o aplicație web tipică, monolit.

O abordare serverless ar arăta în felul următor, dacă am dori să rescriem aplicația monolit descrisă anterior:

  1. Serviciul de autentificare e acum delegat unei terțe părți, el putând fi oferit sub forma unei platforme BaaS.
  2. Pentru stocarea produselor, se poate utiliza un alt furnizor de servicii BaaS.
  3. Componente ale logicii de business care există într-o arhitectură tradițională pe partea de server, pot fi acum delegate clientului, respectiv browserului: managementul sesiunilor, navigarea între pagini sau procesarea unor date returnate dintr-o bază de date și afișarea lor pe ecran.
  4. Parte din funcționalitate va continua a fi deservită pe partea de server, cum ar fi procesarea unor calcule intensive sau a unui set mare de date. Funcția de căutare ar putea fi accesată printr-un Portal de API-uri, prin cereri bazate pe HTTP. Se poate reutiliza codul sursă originar aplicației monolit în momentul în care mutăm codul către furnizorii de servicii FaaS Azure Functions sau AWS Lambda, deoarece oferă un număr larg de limbaje de programare pe care le pot executa, cum ar fi .NET, Java sau Python.
  5. Funcționalitatea de cumpărare poate fi înlocuită cu o altă funcție FaaS expusă prin Portalul de API-uri.

Având această privire de ansamblu asupra arhitecturii serverless, putem să luăm ca exemplu practic, Azure Functions, serviciul FaaS oferit de Microsoft și să vedem cât de rapid poate fi folosit.

Azure Functions

Azure Functions este o soluție care permite într-un mod foarte facil executarea unor bucăți de cod de mici dimensiuni ("funcții") în internet. Poți scrie codul care rezolvă o anumită problemă de business, fără a te îngrijora de detaliile legate de infrastructura pe care se va executa. Codul sursă poate fi scris într-o varietate de limbaje de programare, cum ar fi: C#, F#, Nodejs, Python sau PHP.

Caracteristici

Acestea ar fi principalele beneficii ale Azure Functions:

Scenarii obișnuite în care poate fi utilizat Azure Functions

  1. Procesare dependentă de timp - executarea unei funcții de ștergere sau procesarea de taskuri după un anumit orar.

  2. Serviciile Azure de procesare a evenimentelor - reacționarea la evenimente transmise către Azure Event Hub. Folosit cu precădere în aplicații de instrumentare a evenimentelor, a prelucrării fluxurilor de lucru sau în scenarii de Internet of Things (IoT).

  3. Procesarea evenimentelor provenite din SaaSuri - Azure Functions oferă posibilitatea integrării mecanismelor de declanșare bazate pe evenimente ce au loc într-o alta platformă de tip SaaS, cum ar fi un nou fișier salvat în OneDrive ca declanșator al funcției.

  4. Aplicații web bazate pe arhitectura serverless - Azure Functions poate fi motorul unei aplicații web de tip single page application (SPA).

  5. Backend pentru aplicații mobile - o aplicație pe un dispozitiv mobil ar putea captura o imagine care mai apoi ar putea apela o funcție Azure pentru a putea încărca imaginea într-un blob storage. O a doua funcție Azure ar putea fi declanșată de acea încărcare așa încât să redimensioneze imaginea la valori care să fie potrivite cu dispozitivele mobile.

  6. Procesare în timp real - de exemplu, dispozitive IoT ar putea transmite mesaje către Azure Stream Analytics, care mai apoi să apeleze o funcție Azure, pentru a procesa mesajul respectiv.

  7. Mesagerie în timp real realizată programatic - Integrarea Bot Framework cu o funcție Azure pentru a procesa un mesaj provenit de la Cortana Analytics.

Limbaje de programare suportate care pot fi folosite pentru a scrie funcții Azure:

Mecanisme de declanșare

(* - Răspunsul de tip HTTP este declanșat de o cerere HTTP)

Preț

Prețuri efective începând cu 1 Ianuarie, 2017

\Subvențiile gratuite se aplică doar abonamentelor plătite.*

Care este tehnologia care stă la baza Azure Functions?

Azure Functions sunt construite pe baza App Service.

Creează prima ta funcție Azure

Pentru început, navighează la adresa functions.azure.com și autentifică-te pentru a accesa o subscripție gratis sau apasă pe butonul verde "Try It For Free".

Selectează Timer ca scenariu, JavaScript pentru limbajul de programare și selectează butonul Create this function.

Alege apoi un furnizor de servicii de autentificare.

După ce te vei autentifica, în scurt timp vei fi întâmpinat de editorul care îți va permite să scrii codul sursă al funcției.

În meniul din stânga, Integration, poți accesa punctele de integrare cum ar fi orarul cron pentru funcțiile declanșate la un anumit interval orar sau detaliile de conectare la containerele Blob Storage. În secțiunea Manage sunt disponibile cheile de autentificare precum și valorile de mediu specifice funcției. Pentru a vedea metricele rezultate în urma execuției funcției, se poate accesa ecranul Monitor din meniu.

În secțiunea Function app settings se pot gestiona setări cum ar fi CORS și metadatele SWAGGER, pentru funcții declanșate de cereri HTTP - care se comportă precum APIuri. Tot în acest meniu, se realizează conectarea la servere centralizate de gestionare a codului sursă (GitHub, VSTS, etc.) precum și configurarea unui proces de deployment continuu.

Mergând înapoi în meniul develop, se poate inspecta structura fișierelor prin View Files, din meniul de sus.

În mod obișnuit, o funcție Azure scrisă în limbajul JavaScript are următoarea structură:

După ce apeși Run funcția este executată, iar în cadrul ferestrei log poți observa rezultatul.

Concluzie

Conceptul de arhitectură serverless este încă într-o fază incipientă. E fascinant de urmărit companii precum Amazon, Microsoft, Google sau altele, în modul în care vor continua să aducă inovație în acest domeniu. În același timp, o mare provocare ne este lansată și nouă, programatorilor, și anume: cum putem adăuga arhitectura serverless în opțiunile disponibile rezolvării problemelor ridicate de business.