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.
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.
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:
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 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.
Acestea ar fi principalele beneficii ale Azure Functions:
Selecția de limbaje de programare - poți scrie funcții folosind: C#, batch, PHP, Python sau chiar să execuți aproape orice tip de executabil.
Plătești cât consumi - plătești doar pentru timpul folosit pentru executarea codului.
Gestionarea dependențelor - Poți folosi nuget sau npm pentru a reutiliza librăriile favorite.
Securitate integrată - Funcțiile expuse prin HTTP pot fi securizate folosind furnizorii OAuth cum ar fi Azure Active Directory, Facebook, Google, Twitter sau folosind contul Microsoft.
Integrare simplificată - Este posibilă integrarea cu celelalte servicii oferite de Microsoft în Azure sau de alți furnizori de servicii SaaS.
Dezvoltare flexibilă - codul sursă poate fi editat direct în portal sau poate să fie rezultatul unui pipeline de integrare continuă având la bază un cod sursă găzduit în GitHub sau Visual Studio Team Services.
Procesare dependentă de timp - executarea unei funcții de ștergere sau procesarea de taskuri după un anumit orar.
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).
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.
Aplicații web bazate pe arhitectura serverless - Azure Functions poate fi motorul unei aplicații web de tip single page application (SPA).
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.
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.
Cu suport de primă clasă
Node/Javascript
Cu suport experimental
F#
Python
PHP
Batch
Bash
PowerShell
(* - Răspunsul de tip HTTP este declanșat de o cerere HTTP)
Prețuri efective începând cu 1 Ianuarie, 2017
\Subvențiile gratuite se aplică doar abonamentelor plătite.*
Azure Functions sunt construite pe baza App Service.
Rulează pe planurile App Hosting existente.
Funcționează alături de Web, Mobile, și API Apps.
Beneficiază de toate caracteristicile App Service.
Continuous Deployment.
Deployment Slots.
Pot fi executate într-un mediu izolat și dedicat.
App Service Environment ajută la executarea dedicată a App Services.
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ă:
function.json
Stochează detaliile legăturilor folosite pentru intrare și ieșire.
Configurația orarului de declanșare.
project.json
index.js
După ce apeși Run funcția este executată, iar în cadrul ferestrei log poți observa rezultatul.
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.