Approfondimenti12/6/2023

Architettura a microservizi: Caratteristiche e vantaggi

cloud native

La capacità delle aziende di adeguare le applicazioni alle mutevoli esigenze di business dipende in gran parte dal framework architetturale sottostante. Un’architettura rigida e obsoleta non permette la dovuta flessibilità per apportare modifiche in un’ottica di maggiore scalabilità, velocità e performance delle applicazioni enterprise. Per questo motivo, il tradizionale approccio alla progettazione delle applicazioni viene sempre di più sostituito da un pattern architetturale distribuito: l’architettura a microservizi.

CHE COS’È UN’ARCHITETTURA A MICROSERVIZI?

Un’architettura a microservizi (microservices) è un modello architetturale utilizzato per la progettazione software di una singola applicazione. Questo paradigma permette di suddividere le funzionalità dell’applicazione in piccole unità distribuibili in modo indipendente, definite microservizi, che comunicano tra di loro tramite protocolli “leggeri”. Quindi ogni servizio gestisce un sottoinsieme di funzionalità applicative ed è responsabile di una parte di dominio indipendente dal dominio globale (bounded context). L'architettura a microservizi consente ai team di sviluppare più servizi indipendenti che possono essere aggiornati, scalati e rilasciati separatamente.

Le caratteristiche dei microservizi

Le principali caratteristiche dei microservizi sono: 

Autonomia: l’indipendenza e il disaccoppiamento dei microservizi permettono ai team di organizzarsi autonomamente e concentrarsi su un dominio più ristretto e con una superfice di cambiamento più piccola. Ciò consente all'azienda di cambiare ed evolvere rapidamente i servizi in base alle esigenze del business senza dover riscrivere l'intera applicazione. 

Scalabilità: i microservizi sono estremamente scalabili e consentono all’azienda di ridimensionare velocemente le sue risorse per gestire i picchi di traffico o le richieste dell’utente. Essi possono anche essere distribuiti su più macchine per garantire una maggiore resilienza e affidabilità nella rete. 

Cloud Ready: questo modello architetturale garantisce l’elasticità di poter decidere nel tempo, qualora ce ne sia bisogno, di spostare alcuni componenti software sul Cloud o integrare dei servizi PaaS nel proprio dominio. 

API business oriented: i microservizi collaborano tra di loro attraverso interfacce di programmazione di applicazioni (API) standardizzate. Ciò permette l’utilizzo di diversi linguaggi di scrittura e l’adozione di diverse tecnologie. 

I microservizi rappresentano un modello ampiamente utilizzato dalle più grandi società high-tech, come Netflix, Amazon Prime, Spotify, Airbnb e Twitter. Infatti, queste realtà si basano su migliaia di microservizi che gestiscono quotidianamente miliardi di richieste da parte degli utenti. Ogni microservizio è responsabile di una singola funzionalità della piattaforma, come, ad esempio, lo stato del pagamento mensile, l’algoritmo che individua i contenuti preferiti dell’utente, la messa in memoria delle serie tv viste, la classificazione dei contenuti più poplari del momento.

ARCHITETTURA MONOLITICA VS ARCHITETTURA A MICROSERVIZI

Per evidenziare in modo più netto le caratteristiche dei microservizi è utile introdurre l’approccio tradizionale con cui le aziende hanno sviluppato finora la maggior parte delle applicazioni di classe entreprise: l’architettura monolitica

L’architettura monolitica colloca tutte le funzionalità di un’applicazione in un grande blocco eseguibile, chiamato monolite. Tutte le funzioni sono interdipendenti per cui ogni modifica apportata a una funzionalità deve essere testata per non incidere negativamente sugli altri componenti.

I principali punti di debolezza di un’architettura monolitica sono: 

Nello sviluppo: un sistema monolitico di grandi dimensioni presenta una struttura complessa e, spesso, poca chiara per la mancanza di documentazione degli interventi svolti nel passato. Il rischio di regressioni funzionali è alto ed è causa di timori nel team nel momento in cui sono richieste evoluzioni funzionali. Inevitabilmente, si accumula debito tecnico e rallenta l’intero processo di sviluppo. Inoltre, l’evoluzione di un singolo componente richiede il deployment dell’intera applicazione. 

In termini di performance: il monolite non è concepito per scalare orizzontalmente e verticalmente all’infinito. Risulta difficile aggiungere risorse computazionali e scalare oltre un certo numero di nodi. Quindi, è evidente che il sistema monolitico non garantisce la flessibilità oggi necessaria alle aziende di espandersi e contrarsi in base a un maggior o minor carico di richieste. 

Nello stack tecnologico: Un’applicazione monolitica è costruita con un'unica tecnologia. Se da una parte ciò comporta una minor richiesta di competenze specifiche e limitate ad una sola tecnologia, dall’altra, coesistono problemi di scalabilità generazionale e di eterogeneità. Infatti, risulta difficile adottare un componente di nuova generazione o passare a una versione più recente dello stesso poiché, come spesso accade, la versione inizialmente adottata di un servizio viene personalizzata a tal punto da renderla parte integrante del sistema. Il monolite, inoltre, a causa dello stack tecnologico unico, dipende fortemente da un solo vendor, impedendo all’azienda di liberarsi da alcuni servizi non più convenienti senza causare impatti negativi sull’intero sistema informatico. 

Tuttavia, l’architettura monolitica presenta alcune caratteristiche positive che l’hanno portata ad essere la scelta primaria per sviluppare applicazioni fino a pochi anni fa. La realizzazione di un monolite come un oggetto unico e coeso permette di semplificare l’intero processo di sviluppo, utilizzando un singolo ambiente di sviluppo e un unico stack tecnologico. Ciò richiede meno competenze interne rispetto all’uso dei microservizi e permette una messa in esercizio più agevole, tramite la “pacchettizzazione standard dell‘applicazione” e la successiva consegna al team Ops per la messa in produzione.  
Inoltre, l’architettura a microservizi richiede diversi punti di attenzione, tra cui: 
La complessità del sistema: con un numero maggiore di servizi distribuiti, l'interazione tra di essi può diventare complessa da gestire e richiedere l’implementazione di nuove pratiche collaborative, come DevOps, per coordinare lo sviluppo, il testing, la distribuzione e l'operazione dei microservizi; 
Maggiori skill di progettazione e gestione: questo pattern architetturale richiede delle competenze specifiche e un’organizzazione bilanciata del team in grado di far crescere velocemente le figure junior; 
Maggiore complessità nella gestione dei processi transazionali: è richiesto un meccanismo di coordinamento per garantire l'integrità dei dati e la coerenza delle operazioni; 
Difficoltà con un dominio innovativo: quando i bounded context non sono “stabili” possono portare a sovrapposizioni o lacune funzionali tra i servizi, causando problemi di responsabilità e coordinamento;

ARCHITETTURA A MICROSERVIZI E DEVOPS

L’adozione di architetture a microservizi presuppone delle modalità di gestione agili in grado di supportare l’intero ciclo di vita di ogni servizio. L’aumentato grado di complessità dell’architettura a microservizi richiede una rafforzata collaborazione tra Dev e Ops per supportare pienamente la molteplicità dei servizi, la differenza dei linguaggi di sviluppo e il processo di deployment degli stessi.

DevOps, grazie a un set di pratiche e strumenti orientati ad automatizzare e velocizzare le release di un applicativo, risulta l’approccio necessario per creare un ambiente adeguato ad accogliere, governare e gestire centinaia di servizi. Il modello di flusso continuo di sviluppo e di deployment riduce i tempi di produzione, garantendo la sicurezza e la velocità necessarie per le evoluzioni di un servizio.

MODERNIZZAZIONE DELLE APPLICAZIONI CON ARCHITETTURA A MICROSERVIZI

La modernizzazione delle applicazioni aziendali legacy, originariamente sviluppate con un framework monolitico, richiede spesso un refactoring architetturale. Per liberarsi dai limiti e vincoli imposti da un’architettura obsoleta e poco flessibile le aziende optano per un intervento radicale verso un modello architetturale a microservizi. È possibile ristrutturare e ottimizzare il codice e l’architettura applicativa in misura più o meno significativa, fino ad una riscrittura completa. Questo approccio risulta in molti casi l’unica alternativa per poter migrare al cloud applicazioni legacy custom, realizzate con tecnologie non compatibili con l’offerta di servizi cloud IaaS e PaaS e che non trovano alternative SaaS con funzionalità adeguate. 

SCOPRI IL 1° WHITEPAPER e IL 2° WHITEPAPER SU APPLICATION MODERNIZATION

QUANDO USARE L’ARCHITETTURA A MICROSERVIZI?

I microservizi non sempre rappresentano la scelta ottimale per sviluppare un’applicazione. La decisione di adottare o meno un’architettura a microservizi dipende dalle specifiche dell’applicativo che si vuole realizzare o modernizzare ed in particolare dalla sua dimensione e complessità

A questo proposito, il grafico proposto da Martin Fowler, che evidenzia il trade-off tra produttività e complessità di un’applicazione, dà un’indicazione generale del momento in cui conviene passare ad un’architettura a microservizi. 

Con una complessità applicativa bassa, i microservizi richiedono un extra dispendio di risorse rispetto ad una struttura monolitica, poiché presentano un overhead di setup, di preparazione degli ambienti e di strumenti, come la development pipeline. In questo caso l‘architettura monolitica continua ad essere l’opzione ideale per progettare e sviluppare un’applicazione. 

All’aumentare della complessità, il monolite incomincia, inevitabilmente, ad accumulare un debito tecnico tale per cui modificarlo e muoverlo dalla posizione in cui si trova per eseguire delle evoluzioni o per risolvere dei problemi diventa molto più complesso. In questo caso, grazie alle loro caratteristiche, i microservizi sono adatti a progetti di grande complessità in cui si desidera ridurre al minimo il tempo necessario per rilasciare nuove versioni e correggere eventuali bug.

Da microservizi a monolite: un’inversione di marcia o un caso d’uso specifico?

A proposito di questo tipo di trade-off architetturali, recentemente è stato pubblicato un caso studio da parte di Amazon Prime Video sulla transizione da microservizi a monolite, creando dibattito negli ambienti IT. L’architettura a microservizi, ampiamente riconosciuta come una best practice per lo sviluppo e la modernizzazione delle applicazioni, è stata considerata da una diversa prospettiva: quella del suo impatto sui costi dell’infrastruttura. Nonostante, soprattutto per applicazioni complesse, è generalmente conveniente dal punto di vista economico il ricorso a architetture a microservizi, per questo caso specifico è stato dimostrato che era possibile ridurre i costi del 90% passando da microservizi a un’applicazione monolitica. In particolare, in origine il team aveva utilizzato componenti serverless ( per esempio, AWS Step Functions or AWS Lambda) per creare una funzionalità di monitoraggio dei video visualizzati con componenti distribuiti. Tuttavia, si sono resi conto che questa architettura poteva essere semplificata tornando ad un approccio monolitico piuttosto che distribuito. Di conseguenza, hanno deciso di impacchettare tutti i componenti in un’unica unità logica e di utilizzare l'orchestrazione per controllarne i componenti, arrivando così a ridurre drasticamente i costi infrastrutturali.

Possiamo trovare una spiegazione a questo caso nei principi espressi da Martin Fowler, che vanno nella direzione di considerare l’utilizzo dei microservizi o dell’architettura monolitica secondo i casi d’uso specifici, previa analisi dei costi e dei benefici sia nel breve termine che nel lungo, in quanto le due soluzioni non sono intrinsecamente buone o cattive, ma ognuna ha i suoi compromessi. In questo contesto, è l’esperienza nell’utilizzo di microservizi a fare la differenza, poiché permette di prendere delle scelte consapevoli e di valore per il business attuale e del futuro, senza cadere nella trappola di seguire incondizionatamente le ultime tendenze.

Vuoi approfondire i microservizi?

Compila il form per parlare con un nostro esperto!