Introduzione

Durante lo sviluppo di applicazioni Cloud bisogna tenere in considerazione che la crescita della complessità di tutto il progetto può complicare nel tempo le operazioni di coding, testing, deploy e scalabilità dei servizi. Quando si comincia a lavorare su un nuovo progetto dove i servizi sono relativamente pochi è facile per il team di sviluppo aggiungere nuove funzionalità al prodotto software, scrivere unit test per verificare le funzionalità del codice scritto, effettuare le attività di deploy e scalare facilmente l’applicativo.

I problemi delle architetture monolitiche

Man mano che l’applicativo cresce in termini di complessità e di funzionalità si rischia di concentrare tutto il lavoro effettuato all’interno di un software monolitico che rende l’intero progetto difficile da mantenere, da ampliare e soprattutto da scalare orizzontalmente. Risulta inoltre complesso mantenere i principi del loose coupling dei componenti software e con il passare degli anni, in cui spesso le tecnologie informatiche si evolvono completamente, si finisce per ereditare un applicativo basato su tecnologie legacy il cui porting risulta essere complicato vista la mole di funzionalità sviluppate.

Il rischio di rendere il progetto legacy

Dopo poco tempo dall’avvio del progetto si è costretti a fronteggiare un processo di evoluzione del software abbastanza tortuoso in cui il team di sviluppo si ritrova scoraggiato nello sviluppare nuove funzionalità, da una parte per l’impiego di tecnologie che nel tempo sono diventate sempre più inefficienti, dall’altro per la difficoltà di effettuare i test di verifica su un prodotto che è diventato relativamente grande, dato che, la semplice introduzione di una nuova funzionalità rischia di introdurre potenziali bug in altre sezioni dell’applicativo a causa della natura monolitica del progetto.

Un processo di Deploy complicato

Una volta che tutte le difficoltà di sviluppo sono state risolte bisogna avere a che fare con un processo di deploy complesso che spesso comporta un distacco totale del servizio per il cliente finale (dato che tutti i servizi offerti dalla piattaforma devono essere aggiornati contemporaneamente) oltre alla problematica di allocazione delle risorse per la scalabilità orizzontale dell’applicativo (non è possibile allocare risorse solamente per alcune funzionalità del sistema ma di fatto bisogna allocarle per l’intero applicativo).

Che cosa sono i microservizi?

Per risolvere alcune di queste problematiche che sorgono durante la realizzazione di un progetto, negli ultimi anni si fa sempre più riferimento ad una progettazione architetturale basata sui Microservizi. I Microservizi sono piccoli servizi autonomi che interagiscono fra di loro, ognuno dei quali ha il compito di occuparsi in maniera mirata di una funzionalità “semplice” dell’intero sistema. Spesso la prima domanda che viene posta quando si inizia ad adottare questo approccio è: quanto deve essere “piccolo” un Microservizio? Sebbene la decisione di questo dipende dal problema che si sta affrontando, bisogna considerare che, più si riesce a rendere piccolo il microservizio più si riescono a ottenere determinati benefici.

I Microservizi sono Piccoli ed Autonomi

Qualcuno sostiene che un microservizio debba essere abbastanza piccolo da essere riscritto totalmente in due settimane, ma tale requisito di fatto deve trovare riscontro con il concetto di “autonomia” del microservizio: affinchè un microservizio sia autonomo deve essere in grado di fornire in maniera completa le funzionalità modulari di un applicativo spingendo al massimo il concetto di “disaccoppiamento” tra di esse: se durante la realizzazione di un microservizio siamo in grado di rispondere positivamente alla domanda “posso effettuare una modifica ed effettuare un deploy in produzione del microservizio senza cambiare altro?” allora si sta procedendo nella direzione giusta. L’impiego dei microservizi non porta benefici solo per questioni di refactoring del codice e mantenimento dei componenti in uno stato di loose coupling, ma consente di poter impiegare tecnologie eterogenee all’interno dello stesso progetto.

I principali benefici dell’architettura a Microservizi

Dato che i microservizi vengono utilizzati attraverso API che possono essere utilizzate per ottenere dati dai vari moduli, ognuno di essi può essere scritto utilizzando linguaggi di programmazione, framework, e componenti differenti. Di questo aspetto si ha un enorme beneficio quando si impiegano tecnologie che non riescono ad imporsi rispetto ad altre perché di fatto sono preferibili in base al contesto applicativo: questo ad esempio succede quando bisogna scegliere il tipo di database da utilizzare dove in alcuni casi è preferibile un approccio NoSQL rispetto ad una rinomata soluzione relazionale.

Una contromisura contro l’obsolescenza tecnologica

Man mano che si sviluppano nuove funzionalità (e probabilmente nuovi microservizi) è possibile utilizzare tecnologie più innovative che consentono di pianificare una migrazione dell’intero sistema verso un sistema più all’avanguardia. L’impiego di un’architettura basata sui Microservizi riduce il rischio di ritrovarsi negli anni una piattaforma legacy, dato che, l’impiego di nuove tecnologie diventa una pratica spontanea per i nuovi microservizi e le operazioni di migrazione/refactoring dei componenti già esistenti risulta essere fattibili attraverso uno sforzo contenuto (un microservizio per sua definizione è abbastanza piccolo da essere riscritto in poco tempo).

Maggiore scalabilità, Resilienza e Manutenibilità

Il sistema progettato con una logica a Microservizi beneficia inoltre di una buona scalabilità, resilienza, e manutenibilità. Se una determinata funzionalità del sistema viene utilizzata maggiormente è possibile scalare orizzontalmente solo i microservizi associati ad essa avendo quindi un risparmio di risorse considerevole rispetto alla soluzione di replicare l’intero applicativo monolitico. Inoltre se una funzionalità presenta un disservizio (dovuto ad un bug in produzione o ad un problema sistemistico) tale problema non si ripercuoterà sull’intera piattaforma. Intervenire nell’ambiente di produzione per aggiornare un microservizio o effettuare operazioni di manutenzione ordinaria/straordinaria significa non preoccuparsi di bloccare il funzionamento di un’intera piattaforma consentendo quindi di pianificare più facilmente tali operazioni, rendendo spesso più veloci le operazioni di delivery delle nuove funzionalità.

Maggiore riutilizzabilità dei componenti sviluppati

Le aziende che adottano un approccio a Microservizi possono godere di alcuni vantaggi in termini di composizione della propria suite di prodotti e di una organizzazione strutturale ottimale dei propri sviluppatori. Dato che ogni microservizio rappresenta una funzionalità autonoma di un determinato sistema è possibile impiegarli tra diversi progetti sfruttando al meglio la riutilizzabilità del codice sviluppato.

Una migliore organizzazione del Gruppo di Lavoro

In aggiunta al concetto di riutilizzabilità del codice, è possibile ridurre i rischi legati alla formazione e all’ampliamento dei team di sviluppo; quando si ha la necessità di aumentare la propria forza lavoro per incrementare lo sviluppo di un progetto, il maggiore rischio in cui si incorre è la difficoltà nel trovare sviluppatori esperti che utilizzano uno stack di tecnologie compatibile con quello impiegato nel proprio prodotto software che siano capaci di comprendere in tempi brevi le dinamiche funzionali di una piattaforma complessa in sviluppo da diverso tempo; seguendo una progettazione a microservizi è possibile ridurre i rischi legati all’aumento del personale, dato che, è possibile formare dei team che possono iniziare a sviluppare immediatamente con le tecnologie con cui si sentono a proprio agio senza la necessità di dover comprendere nella sua interezza un sistema complesso.

Per concludere

Lo sviluppo orientato ai Microservizi fornisce una metodologia di sviluppo a basso rischio che abbraccia perfettamente i concetti di programmazione Agile, DevOps e CI/CD; per tale motivo, importanti compagnie come Amazon, Netflix, Ebay, Groupon e Uber hanno deciso di adottare tale approccio. Sebbene una strategia di sviluppo orientata ai Microservizi introduce alcune problematiche non presenti in un approccio monolitico (ad esempio concetti di transazione/procedure atomiche, integrità referenziale e aggregazione dei dati) è sicuramente importante valutarne l’adozione per beneficiare di diversi vantaggi che risultano essere essenziali durante lo sviluppo di progetti complessi. Noi alla IES Solutions utilizziamo un approccio orientato ai Microservizi per lo sviluppo dei nostri prodotti; questo ci permette di fornire ai nostri clienti prodotti robusti e all’avanguardia in grado di crescere agilmente a seguito della necessità di nuove funzionalità applicative.