Monolite vs Microservizi: Come Scegliere la Tua Architettura nel 2026
Il pendolo dell'architettura ha oscillato. I microservizi non sono piu' la risposta predefinita. Ecco come decidere — con consigli pratici su monoliti modulari, strategie di estrazione e la domanda che taglia il dibattito.
Per la maggior parte di un decennio, la saggezza convenzionale nell'architettura software era semplice: i microservizi sono il futuro e i monoliti sono legacy. Se stavi iniziando un nuovo progetto, costruivi microservizi. Se avevi un monolito esistente, ne pianificavi la scomposizione. La domanda non era se adottare i microservizi, ma quanto velocemente potevi arrivarci.
Quel consenso e' morto. Negli ultimi tre anni c'e' stata un'ondata di post-mortem da team che hanno adottato i microservizi troppo presto, troppo aggressivamente o per le ragioni sbagliate. Il team di Amazon Prime Video ha pubblicato un caso studio che mostrava che passare da microservizi serverless a un monolito ha ridotto i costi del 90%. InnoGames ha riportato di aver dimezzato la complessita' dell'infrastruttura consolidando i microservizi in un monolito. Queste storie non sono anomalie — sono la punta avanzata di una correzione.
Questo articolo non e' un argomento a favore di un'architettura rispetto all'altra. E' un quadro decisionale per scegliere tra di esse, scritto per il 2026, con il beneficio di aver osservato un ciclo completo di hype e disillusione. Alla fine, saprai esattamente quali domande fare prima di scegliere la tua prossima architettura.
Il Pendolo e' Tornato Indietro
La promessa originale dei microservizi era seducente: distribuibilita' indipendente, autonomia del team, stack tecnologici poliglotti e scalabilita' orizzontale. Ogni servizio poteva essere sviluppato, testato e distribuito da un piccolo team senza coordinarsi con nessun altro. Se un servizio falliva, non avrebbe abbattuto l'intero sistema. Se un servizio aveva bisogno di scalare, scalavi solo quel servizio.
Questi benefici sono reali, ma hanno un prezzo che e' stato sistematicamente sottostimato durante gli anni dell'hype. Ogni microservizio introduce latenza di rete, complessita' di sistema distribuito, sfide di consistenza dei dati e overhead operativo. Un monolito ha una pipeline di deployment, un'applicazione da monitorare, un database da gestire e un codebase da navigare. Dieci microservizi hanno dieci di tutto, moltiplicato per i punti di integrazione tra di essi.
L'intuizione fondamentale che l'industria ha riscoperto e' che i microservizi sono un costo, non un beneficio. Sono uno strumento per gestire vincoli specifici — dimensione del team, requisiti di scaling, frequenza di deployment — non uno stato finale a cui ogni sistema dovrebbe aspirare. Se non hai il problema che i microservizi risolvono, non migliorano il tuo sistema. Lo rendono piu' costoso e piu' difficile da cambiare.
I microservizi sono una buona soluzione per un insieme specifico di problemi. Se non hai quei problemi, stai pagando il costo dei microservizi senza ottenere il beneficio. L'architettura piu' costosa e' quella che risolve problemi che non hai.
Il panorama del 2026 riflette questa correzione. Le architetture di puri microservizi sono ora concentrate nelle organizzazioni che ne hanno realmente bisogno — grandi organizzazioni di ingegneria con dozzine di team, piattaforme che necessitano di scaling indipendente di diversi componenti e prodotti dove servizi diversi hanno requisiti fondamentalmente diversi di affidabilita' o latenza. Ovunque altro, i team scelgono architetture piu' semplici e riservano i microservizi per i casi specifici che li richiedono.
Quando Vince il Monolite
Un monolito e' il default corretto per la maggior parte dei progetti. Questa non e' un'affermazione controversa tra architetti esperti, ma contraddice il messaggio che molti sviluppatori hanno assorbito durante il ciclo di hype dei microservizi. Il monolito vince in piu' scenari di quanti ne perda, e la chiave e' sapere quali sono quegli scenari.
La dimensione del team e' il singolo predittore piu' forte del successo architetturale. Se il tuo team ha meno di dieci sviluppatori, un monolito e' quasi certamente la scelta giusta. Con un team piccolo, l'overhead di coordinamento dei microservizi — allineare i confini dei servizi, gestire i contratti inter-servizio, mantenere multiple pipeline di deployment — consuma una frazione significativa della tua capacita' ingegneristica disponibile. Ogni confine di servizio che crei e' un contratto che devi mantenere, e la manutenzione dei contratti e' lavoro che non produce funzionalita'.
Lo stadio di startup e' un altro segnale chiaro. Se il tuo prodotto ha meno di due anni o il tuo modello di business e' ancora in evoluzione, un monolito preserva la tua capacita' di cambiare direzione rapidamente. I microservizi bloccano ipotesi sui confini del dominio che quasi certamente sbaglierai nel primo anno. Un monolito ti permette di rifattorizzare liberamente. Quando l'intera applicazione e' un unico codebase, spostare una funzionalita' da un modulo all'altro e' un'operazione di refactoring. Quando la tua applicazione e' dieci servizi, spostare una funzionalita' richiede cambiare le interfacce dei servizi, aggiornare i consumatori, coordinare i deployment e migrare i dati.
# What a simple monolith deployment looks like in 2026
# A single Dockerfile, a single service, zero orchestration
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/server.js"]
# One docker-compose.yml for the entire stack
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://db:5432/app
db:
image: postgres:17
volumes:
- pgdata:/var/lib/postgresql/dataLa semplicita' operativa di questa configurazione e' difficile da sopravvalutare. Un servizio da monitorare, un insieme di log da controllare, un deployment da rollbackare. Uno sviluppatore junior puo' capire l'intera pipeline di deployment in un pomeriggio. Quando qualcosa si rompe, c'e' esattamente un posto dove cercare la causa. Questa semplicita' non e' un lusso — e' un vantaggio strategico che si accumula nel tempo.
La complessita' del dominio e' un altro fattore che spinge verso i monoliti. Paradossalmente, piu' il tuo dominio e' complesso, piu' la scomposizione prematura in servizi diventa pericolosa. Se dividi un dominio complesso in servizi prima di comprenderne i confini naturali, creerai servizi che sono accoppiati strettamente in tutti i modi sbagliati — servizi che non possono essere distribuiti indipendentemente perche' cambiarne uno richiede di cambiarne un altro, servizi che condividono database perche' i dati non si dividono in modo pulito, servizi che devono essere distribuiti in sincronia perche' i loro contratti continuano a cambiare.
Il Monolite Modulare: L'Architettura che la Maggior Parte dei Team Non Considera Mai
La scelta netta tra monolito e microservizi e' una falsa dicotomia. Il monolito modulare occupa la via di mezzo ed e' la risposta giusta per piu' team di quanto lo siano entrambi gli estremi. Un monolito modulare e' una singola unita' di deployment con moduli interni chiaramente definiti che seguono le stesse regole di confine dei microservizi, ma senza la rete.
La differenza chiave tra un monolito modulare e un monolito tipico e' la disciplina. In un monolito tipico, i moduli non sono applicati — qualsiasi codice puo' importare qualsiasi altro codice e, col tempo, i confini si erodono in una palla di fango. In un monolito modulare, i moduli hanno API pubbliche esplicite e implementazioni private. Il Modulo A puo' interagire con il Modulo B solo attraverso l'interfaccia definita di B. L'accesso diretto al database attraverso i confini dei moduli e' vietato. Le stesse regole che governano la comunicazione dei microservizi si applicano, ma la comunicazione avviene attraverso chiamate di funzione invece che richieste HTTP.
Questo approccio ti da' la maggior parte dei benefici dei microservizi — confini applicati, sviluppo indipendente all'interno dei moduli, contratti chiari — senza i costi operativi. Ottieni una pipeline di deployment, un'applicazione da monitorare e un codebase da navigare. Ma ottieni anche confini di modulo che prevengono il problema della palla di fango e rendono la futura estrazione in microservizi lineare.
// A modular monolith boundary in TypeScript
// Each module exposes only its public API
// modules/orders/public-api.ts
export {
createOrder,
getOrderById,
getOrdersByUser,
OrderService,
} from "./order-service";
// modules/orders/internal/ ← everything here is private
// order-repository.ts
// order-validator.ts
// order-pricing.ts
// modules/payments/public-api.ts
export {
processPayment,
getPaymentStatus,
refundPayment,
} from "./payment-service";
// Cross-module dependency is explicit and auditable
// payments/payment-service.ts imports from orders/public-api
import { getOrderById } from "../../orders/public-api";Il monolito modulare e' anche la migliore copertura contro un futuro incerto. Se costruisci un monolito modulare e poi scopri che un modulo deve diventare un servizio indipendente, l'estrazione e' meccanica: copi il codice del modulo in un nuovo servizio, esponi la sua API pubblica su HTTP o una coda di messaggi e colleghi il chiamante. I confini del modulo esistono gia'. Le interfacce sono gia' definite. Il lavoro difficile — capire i confini del dominio — e' gia' stato fatto.
Se costruisci un monolito tradizionale senza confini di modulo e poi vuoi estrarre servizi, affronti un problema molto piu' difficile. Devi prima scoprire dove dovrebbero essere i confini, poi rifattorizzare il codice per rispettarli, e solo dopo estrarre. Ecco perche' la maggior parte delle migrazioni da monolito a microservizi fallisce — i team sottostimano il lavoro di scoperta dei confini e finiscono con microservizi accoppiati in modi che vanificano lo scopo.
- Monolite modulare: singola unita' distribuibile, chiamate di rete sostituite da chiamate di funzione, confini di modulo applicati, percorso di estrazione facile.
- Monolite tradizionale: singola unita' distribuibile, nessun confine applicato, massima liberta' nelle fasi iniziali, percorso di estrazione doloroso.
- Microservizi: molte unita' distribuibili, chiamate di rete per la comunicazione, confini di servizio applicati, alto costo operativo.
- Il monolito modulare e' di solito il miglior punto di partenza perche' preserva le opzioni senza impegnarsi nella complessita' dei sistemi distribuiti.
Quando i Microservizi Hanno Realmente Senso
I microservizi non sono sbagliati. Sono sbagliati per la maggior parte dei team, ma ci sono scenari in cui il costo e' giustificato dal beneficio. La chiave e' essere onesti sul fatto che il tuo scenario si adatti effettivamente.
Lo scaling indipendente e' la ragione piu' difendibile per i microservizi. Se parti diverse del tuo sistema hanno profili di scaling drammaticamente diversi — il tuo gateway API deve gestire 100.000 richieste al secondo mentre il tuo servizio di reporting ne gestisce 100 all'ora — metterli nella stessa unita' di deployment spreca risorse. L'hardware del servizio di reporting resta inattivo, e l'auto-scaling del gateway API e' vincolato dal tempo di avvio a freddo del servizio di reporting. Servizi separati possono scalare indipendentemente, e i risparmi sui costi derivanti dall'uso efficiente delle risorse possono compensare l'overhead operativo.
L'autonomia del team e' la seconda ragione legittima. Quando hai piu' team che lavorano sullo stesso sistema e ogni team deve distribuire indipendentemente con la propria cadenza, i microservizi rimuovono il collo di bottiglia del coordinamento. Il Team A puo' distribuire il suo servizio tre volte al giorno senza aspettare che il Team B completi la sua revisione. Ma nota la soglia: questo argomento si applica solo quando hai piu' team. Se la tua organizzazione ha dieci sviluppatori in totale, non hai un problema di coordinamento che i microservizi risolvono. Hai un problema di comunicazione che un canale Slack condiviso puo' risolvere.
Requisiti diversi di affidabilita' o latenza giustificano anche i microservizi. Se il tuo servizio di elaborazione pagamenti necessita del 99,999% di uptime mentre il tuo servizio di analisi puo' tollerare downtime occasionali, separarli garantisce che un bug nel reporting analitico non impedisca ai clienti di completare gli acquisti. Analogamente, se una parte del tuo sistema richiede latenza estremamente bassa e un'altra puo' tollerare latenza piu' alta, separarli ti permette di ottimizzare ciascuno indipendentemente.
La diversita' tecnologica e' l'argomento piu' debole per i microservizi. Si', i microservizi ti permettono di usare linguaggi e database diversi per servizi diversi. Ma in pratica, la maggior parte delle organizzazioni converge comunque su un piccolo insieme di tecnologie, e il costo operativo di mantenere runtime multipli di solito supera il beneficio. Se l'intero team conosce TypeScript e PostgreSQL, costruire un servizio in Rust e un altro in Go solo per usare una tecnologia diversa e' un lusso che la maggior parte delle organizzazioni non puo' permettersi.
Il Pattern Inizia con Monolite, Estrai Servizi
Il pattern piu' affidabile per costruire sistemi software nel 2026 e' anche il piu' semplice: inizia con un monolito modulare, poi estrai servizi quando hai evidenza che ti servono. Questo e' talvolta chiamato pattern monolite-primo o estrai-microservizi, ed e' diventato la raccomandazione predefinita dalle organizzazioni che hanno attraversato il ciclo di hype dei microservizi e sono sopravvissute.
Il pattern funziona in quattro fasi. La fase uno e' il monolito modulare. Costruisci l'intera applicazione come una singola unita' distribuibile con confini di modulo rigorosi. Ogni modulo possiede i suoi dati, espone un'API pubblica e mantiene privata la sua implementazione. Usi la stessa disciplina che useresti per i microservizi — contratti chiari, proprieta' dei dati separata, dipendenze esplicite — ma tutto funziona in un singolo processo.
La fase due e' la misurazione. Monitori quali moduli cambiano piu' frequentemente, quali team lavorano su quali moduli e quali moduli hanno requisiti diversi di scaling o affidabilita'. Non estrai servizi basandoti sull'intuizione o sulla speculazione. Li estrai basandoti sui dati — evidenza reale che il monolito sta creando un collo di bottiglia che un confine di servizio risolverebbe.
La fase tre e' l'estrazione. Prendi un modulo che ha dimostrato di dover diventare un servizio — perche' la sua frequenza di cambiamento sta causando troppi deployment del monolito, o perche' i suoi requisiti di scaling sono diversi dal resto del sistema — e lo estrai. Poiche' il modulo ha gia' confini puliti, l'estrazione e' meccanica. Crei un nuovo servizio con la propria pipeline di deployment, esponi l'API pubblica del modulo su HTTP o una coda di messaggi e aggiorni il monolito per chiamare il nuovo servizio invece del modulo direttamente.
// Step 1: Define the extraction candidate as a module
// monolith/src/modules/reports/public-api.ts
export async function generateReport(
reportId: string
): Promise<ReportResult> {
// Implementation detail: queries a separate read-replica,
// takes 30 seconds, should not block the main application
}
// Step 2: When evidence shows this needs to be a service:
// 1. Create a new service from the module code
// 2. Expose the same API over HTTP
// 3. Replace the direct call with a service client
// monolith/src/clients/reporting-service.ts
const client = new ServiceClient({
name: "reporting",
baseUrl: process.env.REPORTING_SERVICE_URL,
timeout: 60000, // This service is slow
});
export async function generateReport(reportId: string) {
return client.post("/reports", { reportId });
}
// The monolith does not need to redeploy — the client handles
// retries, timeouts, and circuit breaking internally.La fase quattro e' la ripetizione. Man mano che il sistema cresce, ripeti il ciclo — misura, estrai, misura di nuovo. Alcuni servizi che estrai potrebbero dover essere ulteriormente estratti in servizi piu' piccoli. Alcuni potrebbero dover essere reincorporati nel monolito se l'estrazione non ha fornito valore. La chiave e' che ogni estrazione e' guidata dall'evidenza, non dal dogma architetturale.
Questo pattern ha un vantaggio critico rispetto all'approccio microservizi-primo: rimanda le decisioni irreversibili. Ogni confine di servizio che crei e' un impegno irreversibile verso la complessita' del sistema distribuito. Una volta che un servizio esiste, non puoi facilmente cambiare i suoi confini senza rompere i client. Iniziando con un monolito ed estraendo solo quando necessario, garantisci che ogni confine di servizio sia giustificato da requisiti reali piuttosto che da speculazioni su necessita' future.
Come Scegliere: Un Quadro Decisionale
Quando stai progettando un nuovo sistema o valutando la tua architettura attuale, esamina queste domande in ordine. Le risposte ti indicheranno l'architettura giusta senza richiederti di predire il futuro.
Prima domanda: quanti sviluppatori lavorano su questo sistema? Se la risposta e' meno di dieci, inizia con un monolito — preferibilmente modulare. Non hai un problema di coordinamento che i microservizi risolvano e non puoi permetterti l'overhead operativo. Se la risposta e' piu' di dieci, la risposta dipende da come sono organizzati. Se lavorano come un unico team, un monolito funziona ancora. Se sono organizzati in team autonomi multipli, i microservizi potrebbero valere la pena di essere considerati.
Seconda domanda: il tuo sistema ha componenti con profili di scaling fondamentalmente diversi? Se ogni parte del tuo sistema deve scalare approssimativamente alla stessa velocita', non c'e' beneficio nel separarle. Se un componente deve gestire diecimila richieste al secondo mentre un altro ne gestisce dieci, separali — ma inizia separando solo il componente ad alto scaling in un proprio servizio, non l'intero sistema.
Terza domanda: puoi distribuire tutte le parti del tuo sistema con la stessa cadenza? Se si', un monolito semplifica la tua pipeline di deployment e riduce il costo di coordinamento. Se no — perche' parti diverse del sistema hanno cicli di rilascio, requisiti normativi o profili di rischio diversi — i microservizi permettono a ciascuna parte di seguire la propria cadenza di deployment.
Quarta domanda: cosa succederebbe se ogni parte del tuo sistema si fermasse contemporaneamente? Se la risposta e' che la tua attivita' si ferma completamente, non stai guadagnando resilienza dai microservizi — stai solo pagando il costo. La vera resilienza richiede non solo servizi separati ma infrastruttura separata, datastore separati e degradazione graduale tra i servizi. La maggior parte dei team non costruisce questo. Costruiscono servizi che sono strettamente accoppiati nel deployment e liberamente accoppiati in teoria, che e' il peggio di entrambi i mondi.
La migliore architettura e' quella che il tuo team puo' distribuire con fiducia, fare debug rapidamente e cambiare senza paura. Qualunque cosa significhi per la tua organizzazione specifica — monolito, monolito modulare o microservizi — e' la risposta giusta. Tutto il resto e' moda architetturale travestita da principio ingegneristico.
Quinta domanda: quanto sei certo dei confini del tuo dominio? Se stai costruendo in un dominio ben compreso con pattern consolidati — e-commerce, gestione dei contenuti, fatturazione — i tuoi confini di dominio sono relativamente stabili e i microservizi sono meno rischiosi. Se stai costruendo in un dominio nuovo dove i confini stanno ancora emergendo, un monolito preserva la tua capacita' di rifattorizzare man mano che la tua comprensione evolve. Confini di servizio prematuri diventano vincoli che rallentano esattamente il processo di apprendimento di cui hai bisogno.
La risposta onesta per la maggior parte dei team nel 2026 e' un monolito modulare. Ti da' la disciplina dei microservizi senza il costo operativo. Preserva l'opzione di estrarre servizi in seguito senza obbligarti alla complessita' del sistema distribuito oggi. E' distribuibile da un singolo sviluppatore, debuggabile con un singolo flusso di log e modificabile con una singola pull request. E se il tuo sistema cresce al punto che un monolito non funziona piu', i confini modulari che hai costruito renderanno la transizione ai microservizi piu' fluida di quanto ti aspetti.
Il pendolo dell'architettura e' tornato verso la semplicita'. Non e' una regressione. E' l'industria che impara dall'esperienza. I team che hanno ignorato l'hype — o si sono ripresi rapidamente — sono quelli che producono funzionalita', non che migrano servizi. Scegli l'architettura che ti permette di produrre, e cambiala solo quando il tuo sistema ti dice che deve cambiare.
