Un'architettura dei microservizi è un approccio di progettazione software che organizza un'applicazione come un insieme di servizi debolmente associati che comunicano tramite protocolli leggeri. I sostenitori dei microservizi sono convinti che l'isolamento e le interfacce snelle offrano più opzioni nell'implementazione e nella componibilità.
Ma i microservizi non sono sempre la soluzione miracolosa di cui spesso si parla.
In questo articolo esamineremo i vantaggi e gli svantaggi dei microservizi e come valutare se un'architettura dei microservizi sia adatta alle tue esigenze aziendali.
Cosa sono i microservizi?
Un'architettura dei microservizi è un approccio allo sviluppo software in cui le soluzioni sono composte da servizi indipendenti di dimensioni ridotte che comunicano tra loro tramite API. Questo approccio può essere definito in base alle seguenti caratteristiche:
- Un insieme di servizi per gestire funzionalità o attività fondamentali: in un'architettura dei microservizi, ogni microservizio è costruito per supportare funzionalità o attività specifiche.
- Dipendenza da protocolli di comunicazione: i servizi comunicano tra loro utilizzando protocolli di comunicazione, come API di risorse HTTP e messaggistica asincrona leggera.
- Organizzazione per capacità di business: i servizi sono organizzati in base alle capacità aziendali, con la linea che separa i servizi spesso definita come “contesto delimitato”. Ad esempio, nell'ecommerce tutto ciò che è correlato alla gestione dei clienti rientrerebbe in un unico contesto delimitato.
Come funzionano i microservizi?
A differenza dell'architettura monolitica in cui tutte le funzioni sono strettamente integrate, l'architettura dei microservizi suddivide le diverse funzioni dell'ecommerce come la gestione dell'inventario, il checkout e i prezzi in una serie servizi individuali debolmente associati.
Ecco alcune delle principali caratteristiche di un'architettura dei microservizi:
- Ogni microservizio opera come modulo autonomo che può essere sviluppato, distribuito e scalato indipendentemente dagli altri.
- Solitamente i microservizi comunicano tra loro attraverso API. Ciò li rende particolarmente adatti ad ambienti di cloud computing come AWS.
- I singoli servizi possono essere scalati secondo necessità senza influenzare l'intero sistema. Ad esempio, è possibile aumentare la capacità del servizio di inventario durante una promozione senza toccare altri componenti.
- Microservizi diversi possono utilizzare tecnologie diverse, come linguaggi di programmazione (ad esempio Java), framework e database.
Questa flessibilità consente alle aziende di scegliere lo strumento migliore per ogni funzione specifica. Nel complesso, l'architettura dei microservizi è preziosa per applicazioni complesse e frequentemente aggiornate che richiedono elevata scalabilità e integrazione di tecnologie diverse.
I vantaggi dei microservizi
Un'architettura dei microservizi ottimizza la suddivisione delle responsabilità e il coordinamento, offrendo ai team di sviluppo maggiore scelta e autonomia. Questo è il motivo per cui molte aziende decidono di utilizzarla.
Tra i principali vantaggi ingegneristici di un'architettura dei microservizi ci sono:
Flessibilità e agilità
Il codice può essere aggiornato facilmente. Ciò consente di distribuire nuove funzionalità senza intervenire sull'intera applicazione. Questa automazione permette di implementare aggiornamenti in modo granulare e sperimentare rapidamente.
Autonomia
A livello di codice, gli sviluppatori e i team possono lavorare in modo indipendente e hanno la possibilità di utilizzare un mix di strumenti e framework diversi.
Time-to-market più rapido
La natura indipendente dei microservizi consente lo sviluppo parallelo tra team diversi, riducendo i tempi di sviluppo e accelerando il lancio di nuove funzionalità o prodotti.
Personalizzazione
I microservizi consentono un'ampia personalizzazione dell’infrastruttura tecnologica. Le aziende possono creare soluzioni uniche integrando nuove tecnologie quali framework, basi di codice, fornitori e strumenti diversi.
Scalabilità
La modularità dei microservizi consente di adattare i componenti indipendentemente l'uno dall'altro senza la necessità di modificare l'intera applicazione.
Sette svantaggi dei microservizi
I microservizi comportano costi e compromessi significativi rispetto ai sistemi monolitici: si ottiene flessibilità pagando per lo sviluppo personalizzato e la manutenzione continua.
La maggior parte dei vantaggi dei microservizi può essere ottenuta con una piattaforma estensibile. Un kernel ben costruito che alimenta la piattaforma può fornire un insieme di contratti e API strutturati e associati che gli consentono di offrire vantaggi in termini di velocità, coesione e bassa manutenzione, pur permettendo estensibilità e configurazione modulare qualora necessario.
Di seguito esamineremo gli svantaggi dei microservizi e come una piattaforma possa offrire lo stesso valore mitigando alcune delle insidie comuni dei microservizi.
- Aumento dei costi di manutenzione
- Complessità organizzativa e overhead
- Complessità di coordinamento
- Rischio di guasti a cascata
- Problemi di prestazioni e affidabilità
- Maggiore complessità della sicurezza
- Difficoltà nella gestione e coerenza dei dati
1. Aumento dei costi di manutenzione
L'agilità e la flessibilità dei microservizi introducono complessità operativa e fanno lievitare i costi di manutenzione. Tuttavia, ciò non significa che i team di sviluppo debbano rinunciare all'estensibilità e alla componibilità come obiettivo della loro architettura ecommerce.
Una forte separazione e composizione dei livelli di servizio sono fondamentali per un'architettura aziendale scalabile e flessibile, che si ottiene al meglio attraverso l'uso di infrastrutture condivise comuni, primitive di codice e contratti di servizio. Ciò consente ai team di operare su più servizi con contesti e strumenti riutilizzabili e permette ai team di sicurezza di applicare garanzie a livello di sistema.
L'estensibilità e la componibilità sono caratteristiche della progettazione del sistema, non una scelta specifica di utilizzare i microservizi.
I microservizi non sono l'unica strada verso l'estensibilità. Le estensioni del kernel e i driver sono modelli che offrono i vantaggi di una piattaforma (velocità, coesione e bassa manutenzione) pur consentendo estensibilità e configurazione modulare.
Un'estensione del kernel consente la possibilità di accoppiamento tra i servizi principali del kernel, permettendo al contempo la personalizzazione inline del suo comportamento o della sua logica. Se ben realizzata, la logica fornita viene eseguita in un runtime sicuro, ottimizzato e gestito che elimina il compromesso tra coordinamento, velocità ed estensibilità. I driver, d'altra parte, forniscono un'integrazione ad alta coesione con il kernel e conferiscono al sistema operativo nuove capacità.
2. Complessità organizzativa e overhead
I microservizi consentono agli sviluppatori di lavorare in modo indipendente utilizzando gli strumenti e i framework che preferiscono, ma l'implementazione di pratiche DevOps efficaci è essenziale per gestire questa indipendenza in modo efficace. I team possono mettere in campo le proprie competenze e distribuire soluzioni rapidamente, ma per i responsabili aziendali c'è un costo di overhead legato all'elevato grado di autonomia dei team.
È necessaria una chiara separazione delle responsabilità e specifiche dettagliate su quali saranno le interazioni tra i microservizi e come verranno gestite a lungo termine e da chi. Senza controllo, si perdono il vantaggio operativo e i benefici derivanti dalla condivisione di standard, modelli e conoscenze tra i team.
Questo porta a costi tecnici crescenti, livelli aggiuntivi di management e infrastrutture tecnologiche bizantine, la cui funzionalità è compresa solo da chi ne ha scritto l'implementazione.
3. Complessità di coordinamento
Il costo riconosciuto dei microservizi è quello relativo alla manutenzione e al coordinamento di più componenti in movimento, simile a quanto accade nell'architettura orientata ai servizi (SOA). E anche se i servizi possono essere distribuiti singolarmente, devono lavorare insieme per raggiungere l'obiettivo desiderato. Le dipendenze tra servizi portano spesso a distribuzioni complesse e fragili.
Una buona architettura sfrutta l'isolamento di componenti e servizi nei punti appropriati. Un uso eccessivo di tale isolamento (errore comune nei microservizi) può portare a implementazioni fragili, difficili da controllare, scalare e sottoporre a debug.
🚧 Storia istruttiva
Quando Airbnb è passata a un'architettura orientata ai servizi per liberarsi delle complessità monolitiche, ha scoperto che il suo approccio basato sui microservizi ha causato un groviglio di complicazioni. Attualmente l'azienda ha circa 2000 servizi gestiti da 500 ingegneri. “Il grafico delle dipendenze era difficile da interpretare”, spiega Jessica Tai, responsabile tecnico e ingegnere dell'infrastruttura dei servizi principali di Airbnb.
Tale complessità ha reso difficile per il team di Airbnb effettuare il debug dei servizi. Inoltre, ci è voluto più tempo per sviluppare funzionalità a causa del crescente numero di modifiche che dovevano essere apportate nei punti di integrazione. I servizi hanno iniziato a duplicare le funzionalità e i dati si stavano frammentando.
4. Rischio di guasti a cascata
La proliferazione di servizi, ciascuno con la propria implementazione, architettura e caratteristiche di prestazione, può complicare l'isolamento dei guasti e aumentare significativamente il rischio di guasti a cascata imprevisti, che richiedono funzionalità mature di tracciamento e debug tra i servizi.
Le piattaforme di maggior successo sono dotate di un insieme curato di dati primitivi, flussi di lavoro e best practice. Scelte progettuali ben ponderate portano a risultati migliori e al successo di coloro che le adottano.
Un'API ben progettata e un'astrazione strutturata codificano le best practice e consentono implementazioni eleganti e scalabili. Ad esempio, un linguaggio di template rigido può eliminare efficacemente il cross-site scripting (XSS) e attacchi alla sicurezza simili sul lato client, o almeno rendere questi attacchi molto difficili da eseguire. Un runtime gestito con limiti di esecuzione, cache e interruttori automatici può anche fornire un contratto solido e garantire prestazioni prevedibili sotto carichi estremi.
Scelte progettuali eccellenti, incorporate in piattaforme e SDK, sono un aiuto per lo sviluppatore. Esse sintetizzano le funzionalità e le esigenze comuni dietro le interfacce standard, limitano ed eliminano modelli e scelte sbagliati, accelerano il percorso verso il valore e riducono al minimo i costi di sviluppo e manutenzione.
5. Problemi di prestazioni e affidabilità
I microservizi offrono una totale libertà di scelta in termini di tecnologia, ma l’overhead derivante dalla gestione delle comunicazioni tra servizi disparati rappresenta un classico problema per le prestazioni.
🚧 Storia istruttiva
Steve Cosenza, ex senior staff engineer di Twitter, spiega cosa succede quando un team indipendente progetta e costruisce degli endpoint per i loro casi d'uso specifici con poco coordinamento: "I microservizi portano alla frammentazione e, inevitabilmente, a un rallentamento della produttività degli sviluppatori. Sebbene l'approccio dei microservizi abbia inizialmente consentito una velocità di sviluppo maggiore, ha anche portato a un'API di Twitter dispersiva e disarticolata".
L'assenza di una convenzione di codice condivisa o di un SDK aumenta i rischi per la sicurezza e i costi di verifica. Inoltre, una piccola incompatibilità di versione e di API può causare problemi agli utenti difficili da risolvere e da individuare.
Affrontare queste sfide richiede ottime conoscenze ingegneristiche e nello specifico ingegneri esperti che sappiano come debuggare un'applicazione complessa e distribuita, un team operativo ben equipaggiato e investimenti nella manutenzione continua e nell'ingegneria della resilienza.
6. Maggiore complessità della sicurezza
L'architettura dei microservizi introduce una superficie di attacco più ampia a causa della proliferazione della comunicazione di rete tra i servizi. Ogni servizio diventa un potenziale punto di ingresso per i malintenzionati. Questo richiede alle aziende di adottare misure di sicurezza efficaci su tutti i componenti.
Ad esempio, una grande azienda di ecommerce ha adottato i microservizi per migliorare la scalabilità, ma ha scoperto che il suo team di sicurezza non riusciva a monitorare e proteggere centinaia di servizi singoli. Una piccola svista nel meccanismo di autenticazione di un servizio ha portato a una significativa violazione dei dati che ha colpito milioni di clienti e causato danni notevoli in termini di reputazione.
Con l'aumentare del numero di servizi, diventa più difficile effettuare controlli di sicurezza completi, con il rischio di lasciare punti ciechi nella sicurezza generale del sistema. Per mitigare efficacemente questi rischi, le aziende devono investire molto in sistemi automatizzati di scansione della sicurezza, registrazione centralizzata e rilevamento avanzato delle minacce.
7. Sfide nella gestione e coerenza dei dati
I microservizi portano spesso alla frammentazione dei dati su più database o sistemi di archiviazione, ciascuno ottimizzato per un servizio specifico. Questa frammentazione complica la gestione dei dati, rendendo difficile mantenere la coerenza e l'integrità dei dati nell'intero sistema.
Per affrontare queste sfide, è necessario implementare sofisticati meccanismi di sincronizzazione dei dati, come l'event sourcing o i sistemi di change data capture (CDC). Queste soluzioni aggiungono un ulteriore livello di complessità all'architettura e richiedono conoscenze specializzate per essere implementate e mantenute efficacemente.
Casi d'uso dei microservizi
- Elaborazione e analisi dei dati in tempo reale: i microservizi possono gestire l'elaborazione e l'analisi dei dati in tempo reale, fornendo insight più rapidamente.
- Elaborazione batch: suddividendo un'attività in servizi indipendenti più piccoli, è possibile elaborare più batch simultaneamente.
- Bilanciamento del carico: i microservizi consentono il bilanciamento del carico scalando solo i servizi che subiscono traffico intenso, il che è più efficiente in termini di risorse.
- Machine learning: modelli diversi o parti diverse di un modello possono essere distribuiti come servizi individuali, rendendo il sistema più gestibile e scalabile.
- Internet delle cose (IoT): i microservizi possono aiutare a gestire efficacemente i dati IoT dividendo le attività tra più servizi.
I microservizi sono adatti alla tua azienda? Spoiler: probabilmente no
I microservizi ti consentono di acquistare un ulteriore livello di flessibilità: la parola chiave è "acquistare".
I microservizi sono notoriamente costosi da costruire e mantenere. A meno che la tua azienda non sia al livello di Amazon o Netflix e abbia bisogno di una flessibilità estrema, il costo alla fine si ripagherà. Con aziende complesse di questa portata, i microservizi meritano probabilmente di essere presi in considerazione.
Ma il più delle volte i microservizi introducono solo costi e complessità inutili, portando le aziende a sovradimensionare la propria infrastruttura tecnologica e a sottrarre risorse ai progetti che offrono valore ai clienti.
La stragrande maggioranza delle aziende trae vantaggio da una piattaforma commerciale solida in grado di offrire velocità, coesione e bassa manutenzione, consentendo al contempo l'estensibilità e configurazione componibile con componenti predefiniti in base alle necessità.
Shopify offre ai brand maggiore libertà di innovare con la piattaforma commerciale più flessibile e performante. La nostra piattaforma è componibile per impostazione predefinita, il che significa che non dovrai più scegliere tra un'architettura monolitica e una dei microservizi. La piattaforma Shopify include una suite completa di efficienti funzionalità commerciali, ma i brand possono anche scegliere di sostituire le funzionalità native di Shopify con altri sistemi di terze parti grazie a un'ampia libreria di integrazioni con tutti i principali sistemi front-end e back-end.
Sebbene non esista una ricetta unica per il successo, una piattaforma ben costruita può ridurre il lavoro, i costi e i rischi, accelerando al contempo il time-to-market e consentendo alle aziende di mettere in mostra le proprie competenze tecniche dove conta davvero: diventando indispensabili per i propri clienti.
Svantaggi dei microservizi: domande frequenti
Qual è il problema più grande dei microservizi?
I microservizi hanno una complessità intrinseca che li rende difficili da gestire. Per funzionare senza intoppi, necessitano di un'architettura ben pianificata, il che rende difficile la configurazione iniziale e la gestione continua. Un sistema distribuito introduce inoltre problemi quali latenza di rete, tolleranza ai guasti, passaggio dei messaggi e coerenza dei dati.
Quali sono gli svantaggi dei microservizi rispetto alle applicazioni monolitiche?
I microservizi presentano diversi svantaggi rispetto a un'applicazione monolitica. I servizi distribuiti possono essere più difficili da gestire perché richiedono coordinamento tra servizi diversi, il che può causare latenza di rete. Può inoltre essere difficile mantenere la coerenza dei dati, poiché ogni servizio può avere il proprio database, e le transazioni tra più servizi possono essere complicate. Spesso è necessario un refactoring per passare da un sistema monolitico a uno di microservizi, il che può essere anch'esso complesso.
Quando non si dovrebbero usare i microservizi?
Quando l'applicazione è semplice o piccola, non si dovrebbero usare i microservizi. È consigliabile evitare i microservizi se il tuo team di sviluppo non ha esperienza con sistemi distribuiti, comunicazioni di rete e transazioni complesse. I microservizi potrebbero non valere il tempo necessario per la configurazione e la complessità per progetti con scadenze a breve termine, soprattutto quando sarebbero sufficienti metodologie di sviluppo software più tradizionali. Se il team di sviluppo non ha l'esperienza o le certificazioni adeguate nei sistemi distribuiti, i microservizi potrebbero non essere l'ideale.
Cos’è meglio dei microservizi?
Le architetture tradizionali possono essere più efficienti e dirette per applicazioni più piccole e semplici. Anche un sistema monolitico modulare può fornire alcuni vantaggi dei microservizi senza la complessità dei sistemi distribuiti. Nonostante i microservizi abbiano un potenziale in termini di scalabilità e prestazioni, l'architettura serverless e l'architettura event-driven potrebbero essere considerate “migliori” in scenari specifici.





