Yury Pukhov, YuSMP Group
Yury Pukhov CEO & Web Engineering Lead, YuSMP Group · Architettura di piattaforme web dal 2011

TL;DR — preferire il monolite modulare come default

Il dibattito architetturale del 2016–2020 — "i monoliti sono morti, i microservizi sono il futuro" — è stato ampiamente corretto dalla dura esperienza operativa. Ecco la versione breve:

  • Monolite modulare come default. Moduli puliti, confini di dominio applicati, una singola pipeline di deployment. Questo è il punto di partenza corretto per la grande maggioranza delle applicazioni web, inclusi SaaS B2B, marketplace e portali enterprise.
  • Estrarre i servizi quando si ha una ragione concreta. Profili di scalabilità diversi, cadenze di deployment indipendenti, o confini di proprietà del team che un monolite non può esprimere chiaramente. Non prima.
  • I microservizi completi hanno senso su larga scala. Pensate a 20+ ingegneri, 10 milioni+ di richieste al giorno, e SLA di servizio genuinamente divergenti. Al di sotto di quella soglia, l'overhead è una pura tassa sulla velocità del vostro team.
  • Un semplice monolite non è vergognoso. Shopify, Stack Overflow e Basecamp hanno generato miliardi di dollari di fatturato con monoliti ben ottimizzati. L'architettura è sbagliata solo se vi impedisce di fare qualcosa che dovete fare.

Le tre opzioni definite

Monolite tradizionale

Una singola applicazione deployabile dove tutta la logica di business, l'accesso ai dati e la presentazione vivono in un'unica codebase e processo. Ogni funzionalità viene consegnata insieme; il database è condiviso; scalare significa eseguire più copie dell'intera applicazione. La classica app Rails, il progetto Django o il servizio Spring Boot è un monolite.

Monolite modulare

Sempre un singolo binario deployabile, ma il codice è partizionato in moduli ben definiti — ognuno con la propria logica di dominio, il proprio namespace dello schema del database e la propria interfaccia pubblica. I moduli comunicano tramite API in-process o contratti di messaggi, non chiamate HTTP. Il risultato è una codebase che si deploya semplicemente ma è strutturata per consentire un'estrazione futura. È l'architettura a cui ci rivolgiamo per prima per i nostri engagements di sviluppo di applicazioni web per i clienti negli USA e in Europa.

Microservizi

Una raccolta di servizi deployabili indipendentemente, ognuno responsabile di un dominio ristretto, che comunicano tramite HTTP o un message broker (Kafka, RabbitMQ, SQS). Ogni servizio ha il proprio database, la propria pipeline CI/CD e il proprio footprint operativo. Fatto bene, permette alle grandi organizzazioni di consegnare velocemente senza interferire tra loro. Fatto prematuramente, è un monolite distribuito con tutti gli svantaggi di entrambi i mondi e nessuno dei vantaggi di nessuno dei due.

Diagramma di architettura su lavagna bianca che mostra i confini dei servizi e i flussi di dati
I confini di dominio puliti tracciati nella fase di progettazione fanno la differenza tra un monolite modulare che si evolve agevolmente e una grande palla di fango che resiste ai cambiamenti. Una buona architettura inizia su una lavagna bianca, non in un cluster Kubernetes.

Cosa può fare davvero un monolite moderno

Il racconto secondo cui "monolite equivale a legacy" è un artefatto di marketing dell'era Kubernetes. Siamo precisi su cosa i monoliti moderni possono e non possono fare.

Scalano orizzontalmente

Eseguire quattro copie di un'app Rails o Django dietro un load balancer è scalabilità orizzontale. Funziona finché il database non diventa il collo di bottiglia — a quel punto si aggiungono repliche in lettura e connection pooling, non necessariamente un nuovo servizio. Stack Overflow serve miliardi di pagine su nove server on-premise. Il collo di bottiglia non era mai il monolite; era la mancanza di caching, indicizzazione e disciplina delle query.

Supportano l'iterazione rapida

Un monolite ha una sola pipeline di deployment. Un unico insieme di test di integrazione. Un solo posto dove cercare un bug. Per un team di 3–15 ingegneri, questo è un enorme vantaggio di coordinamento. Ogni sistema distribuito che aggiungete moltiplica i modi di guasto che dovete monitorare e gli scenari di rollback che dovete esercitare.

Supportano i confini di conformità

La residenza dei dati GDPR, i log di audit HIPAA e i controlli SOC 2 sono più facili da implementare all'interno di una sola applicazione che da applicare su una rete di servizi. Un singolo audit trail, un singolo secrets store, un singolo punto di terminazione TLS. Vedete i pattern che utilizziamo in come costruire un SaaS multi-tenant — la multi-tenancy è pienamente realizzabile all'interno di un monolite modulare.

Dove i monoliti hanno davvero difficoltà

Ci sono limitazioni reali. Se il vostro servizio di checkout deve gestire 50 volte il traffico del vostro modulo di reporting, scalare l'intera app spreca risorse. Se la vostra pipeline di inferenza ML ha requisiti di runtime completamente diversi (GPU, Python, diversa cadenza di deployment), mantenerla nello stesso processo è scomodo. Queste sono le ragioni giuste per estrarre un servizio — non la moda ingegneristica.

Quando i microservizi sono davvero vantaggiosi

Ci sono scenari in cui i microservizi sono la risposta giusta. Ecco come riconoscerli.

Profili di scalabilità genuinamente diversi

Se il vostro motore di raccomandazione prodotti riceve 1.000 richieste al secondo durante i picchi mentre la vostra API di impostazioni utente ne riceve 5, non ha senso scalarli insieme. Una volta che potete quantificare questa divergenza in produzione — non in una sessione su lavagna — l'estrazione del servizio si ripaga da sola. Correlato: vedete lo stack di agenti IA enterprise 2026 per capire perché i workload intensivi in inferenza spesso giustificano l'isolamento esattamente per questo motivo.

Cadenze di deployment indipendenti

Quando team di prodotto separati devono consegnare più volte al giorno senza coordinamento, una singola pipeline di deployment diventa un collo di bottiglia. Questa è la motivazione originale di Amazon per i microservizi — non le performance, ma la velocità organizzativa. Se il vostro team analytics e il vostro team di fatturazione si aspettano a vicenda che il codice dell'altro sia stabile prima di un rilascio, l'architettura sta creando un problema di coordinamento umano che un confine di servizio risolverebbe.

Domini di guasto isolati

Un bug catastrofico in un monolite fa cadere l'intera applicazione. In un'architettura a microservizi, un bug nel vostro servizio di notifiche non deve necessariamente far cadere il checkout. I circuit breaker, i bulkhead e la degradazione graziosa sono pattern che hanno senso solo quando avete confini di servizio ai quali applicarli. Per i flussi ad alto fatturato — pagamenti, API principale, autenticazione — la garanzia di isolamento vale il costo operativo.

Confini regolatori e di residenza dei dati

Un'azienda americana che serve clienti europei sotto il GDPR potrebbe aver genuinamente bisogno che i dati residenti in Europa siano elaborati in un servizio separatamente deployato e verificato, non solo un flag di configurazione in un'app condivisa. Idem per l'isolamento del perimetro PCI DSS — i dati dei titolari di carte elaborati in un servizio separato con il proprio confine di rete sono architettonicamente più puliti che ridurre la superficie di attacco di un monolite.

Costi, dimensioni del team e onere operativo

I microservizi non sono gratuiti. Ogni servizio che aggiungete moltiplica il costo di infrastruttura e personale. Ecco un bilancio onesto.

Ingegnere delle operazioni che monitora un dashboard di server con più servizi visualizzati
Gestire microservizi su larga scala significa gestire una funzione di platform engineering in parallelo con lo sviluppo del prodotto. L'observability, il service mesh, le rotazioni di on-call e i runbook degli incidenti per ogni servizio si accumulano rapidamente — tenetene conto nella vostra decisione architettonica prima di dividere il primo servizio.

Costo dell'infrastruttura

Ogni servizio ha bisogno del proprio: compute (container, Lambda o VM), database o namespace del database, integrazione del gestore di segreti, regola di routing del load balancer o dell'API gateway, voce della pipeline di aggregazione dei log, e monitor di health check. Per un'architettura a dieci servizi, ne gestite dieci di ognuno. Su AWS o GCP, un monolite modulare spesso costa il 60–80% in meno di infrastruttura mensile rispetto a un equivalente mesh di microservizi che gestisce lo stesso traffico.

Costo dell'observability

Un monolite fallisce con uno stack trace in un unico flusso di log. Un sistema distribuito fallisce con trace parziali distribuite su cinque servizi, due code asincrone e uno strato di caching. Il tracing distribuito (Jaeger, Tempo, AWS X-Ray), l'aggregazione di log strutturati (Loki, Datadog, CloudWatch) e i dashboard di salute dei servizi sono obbligatori, non opzionali. Preventivate un ingegnere di piattaforma dedicato più 2.000–8.000 USD/mese in tool SaaS per un team che gestisce 10+ servizi.

Requisiti di dimensione del team

La regola delle due pizze di Amazon (6–10 ingegneri per servizio) è il minimo operativo affinché ogni servizio sia mantenuto senza continui cambi di contesto. Al di sotto di 20–30 ingegneri in totale, i microservizi significano che ogni ingegnere possiede più servizi — esattamente l'overhead di coordinamento che l'architettura avrebbe dovuto eliminare. Vedete anche il playbook di riduzione del churn SaaS per capire come le decisioni architetturali a monte influenzano l'affidabilità del prodotto che guida la retention.

DimensioneMonoliteMonolite modulareMicroservizi
Complessità di deploymentBassaBassaAlta
Costo infrastruttura (stesso traffico)Il più bassoIl più basso2–5x più alto
Overhead di observabilityMinimoMinimoSignificativo
Scalabilità orizzontaleA grana grossaA grana grossaA grana fine
Deployment indipendenti per teamNoParziale
Team min. per funzionare bene3–5 ingegneri5–15 ingegneri20+ ingegneri
Tempo al primo deployment in produzione1–2 settimane1–3 settimane4–8 settimane

Scalare correttamente un'applicazione web

Prima di scegliere un'architettura basata su una scala futura che non avete ancora, applicate questi leve di scalabilità in ordine — la maggior parte delle applicazioni non ha mai bisogno di andare oltre il passo tre.

1. Scalabilità verticale e ottimizzazione delle query

Raddoppiate la dimensione della vostra istanza di database. Aggiungete un indice alla query lenta. Abilitate il connection pooling (PgBouncer, RDS Proxy). Questa è ingegneria gratuita o quasi gratuita che comunemente acquista 5–10x di margine di capacità. La maggior parte delle applicazioni che "hanno bisogno di microservizi per la scala" ha in realtà bisogno di un indice di database e di una cache Redis.

2. Scalabilità orizzontale dell'applicazione

Eseguite più istanze del vostro monolite dietro un load balancer. Aggiungete repliche in lettura per i workload intensivi in lettura. Usate una CDN per scaricare gli asset statici e le risposte API in cache. Un singolo processo Rails o Node.js a 4 vCPU gestisce ~500 richieste/secondo. Otto istanze dietro un load balancer ne gestiscono 4.000. Raggiungete questo limite lentamente.

3. Caching e accodamento asincrono

Redis o Memcached davanti ai vostri percorsi di lettura caldi. Una coda di job in background (Sidekiq, Celery, Bull) per tutto ciò che non deve essere sincrono — email, webhook, generazione di report, chiamate API di terze parti. Scaricare il lavoro asincrono elimina una classe di latenza di coda di richiesta lenta che rende terribile il vostro p95 senza alcun cambiamento architetturale reale.

4. Estrarre un servizio alla volta

Quando un percorso caldo specifico è genuinamente un collo di bottiglia e i passi precedenti sono esauriti, estraete quel servizio usando il pattern strangler fig. Instradate il nuovo traffico verso il servizio mentre il monolite gestisce il resto. Migrate in modo incrementale. Non tentate una riscrittura big bang dal monolite ai microservizi — il tasso di fallimento è alto e il costo è enorme.

Matrice decisionale

Usate questa matrice quando fate la scelta architettuale. Valutate ogni riga per la vostra situazione attuale — non per l'azienda che aspirate ad essere tra tre anni.

CriterioScegliere il monolite modulare se…Considerare i microservizi se…
Dimensione del teamMeno di 20 ingegneri20+ ingegneri su più squad di prodotto
Pattern di trafficoUniforme o basso volume oggiCarichi di picco misurati e divergenti per dominio
Cadenza di deploymentUno o due team, rilasci coordinatiPiù team, cadenze indipendenti richieste
Isolamento di conformitàGDPR/SOC 2 standard gestibile in un'appPerimetro PCI DSS titolari di carte o residenza dati rigorosa
Maturità DevOpsNessun ingegnere di piattaforma dedicatoTeam Platform/SRE già in place
Mix tecnologicoUn linguaggio/runtime principaleGenuino bisogno di runtime misti (es. servizio ML GPU)
Requisito di tolleranza ai guastiDowntime totale accettabile per incidenti rariDegradazione parziale richiesta (il checkout deve sopravvivere a un'interruzione dell'analytics)

FAQ

Una start-up dovrebbe usare i microservizi?

Quasi mai all'inizio. I microservizi moltiplicano la superficie operativa — service discovery, tracing distribuito, pipeline CI/CD indipendenti e un team abbastanza grande da gestire ogni servizio. Il vincolo di una start-up è la consegna rapida del prodotto e l'apprendimento veloce, non la flessibilità dell'infrastruttura. Iniziate con un monolite modulare; estraete i servizi quando un confine concreto di scalabilità o di proprietà ve lo impone.

Cos'è un monolite modulare?

Un monolite modulare è una singola applicazione deployabile, divisa internamente in moduli ben definiti e debolmente accoppiati — ognuno con la propria logica di dominio, il namespace dello schema del database e la superficie API pubblica. Viene deployato come un singolo processo ma è strutturato in modo che i moduli individuali possano essere estratti in servizi separati in seguito con un refactoring minimo. È il punto di equilibrio ideale per la maggior parte dei team con meno di 50 ingegneri.

Quando i microservizi sono vantaggiosi?

I microservizi sono vantaggiosi quando: (1) diverse parti del sistema hanno profili di scalabilità genuinamente diversi — il checkout gestisce 10 volte il carico dell'admin; (2) team indipendenti devono deployare senza coordinare i rilasci; (3) un servizio specifico richiede un technology stack, un SLA o un confine di conformità diverso. Se nessuna di queste condizioni è vera oggi, l'overhead dei microservizi è puro costo.

I microservizi sono più scalabili di un monolite?

Non automaticamente. Un monolite ben ottimizzato su un'infrastruttura cloud moderna gestisce milioni di richieste al giorno con scalabilità orizzontale, connection pooling e repliche in lettura. I microservizi consentono una scalabilità granulare dei percorsi caldi — ma questo vantaggio si materializza solo quando i diversi servizi hanno genuinamente forme di traffico diverse. Molti team aggiungono la complessità dei microservizi prima di avere il traffico che la giustificherebbe.

Quanto dovrebbe essere grande il team per gestire i microservizi?

La regola delle due pizze di Amazon è una guida utile: ogni servizio dovrebbe essere gestibile da un team di 6–10 ingegneri. In pratica avete bisogno di almeno un ingegnere DevOps o di piattaforma dedicato, copertura SRE, strumenti di observability e abbastanza sviluppatori per mantenere ogni servizio senza continui cambi di contesto. Al di sotto di 20–30 ingegneri in totale, i microservizi di solito creano più overhead di coordinamento di quanti ne eliminano.

Posso migrare da un monolite a microservizi in seguito?

Sì — e questo è il percorso raccomandato. Costruite un monolite modulare con confini di dominio puliti fin dall'inizio, e l'estrazione di un servizio in seguito è uno sforzo contenuto: spostate il codice di un modulo, dividete le sue tabelle del database e aggiungete un contratto API. Il pattern strangler fig — che instrada il traffico in modo incrementale verso un nuovo servizio mentre il monolite gestisce il resto — è collaudato per questa migrazione. Non progettate per i microservizi dal primo giorno a meno che non abbiate già il team e il traffico che lo richiedono.

Ultimo aggiornamento 4 giugno 2026. Le raccomandazioni architetturali si basano su engagement in produzione consegnati per clienti americani ed europei tra il 2022 e il 2026. Le cifre sui costi sono stime; la spesa effettiva per l'infrastruttura varia in base al cloud provider, alla regione e alla forma del traffico.