Salta al contenuto
System Integration & Cloud

I tuoi servizi si parlano ancora uno a uno? È ora di farli reagire agli eventi

Quando ogni microservizio deve conoscere tutti gli altri, il sistema diventa fragile. L'architettura event-driven elimina le dipendenze dirette: ogni servizio pubblica fatti, chi è interessato li ascolta. Il risultato è un sistema che scala, resiste ai guasti e si evolve senza riscritture.

throughput sotto carico
92%
riduzione coupling diretto
< 2s
recovery dopo fallimento

Panoramica in 20 secondi

Italy Soft

Vuoi approfondire?

30 minuti di analisi gratuita, senza impegno.

Prenota Audit Gratuito — 30 min

italysoft.it

0:15 / 0:18

Il servizio ordini non dovrebbe sapere chi lo ascolta

Immagina un e-commerce italiano con trentamila ordini al giorno. Ogni volta che un cliente completa un acquisto, il servizio ordini deve avvisare il magazzino per riservare la merce, il modulo di fatturazione per generare il documento fiscale, il sistema di spedizione per preparare il pacco e il servizio notifiche per inviare la conferma via email. In un'architettura tradizionale basata su request-response — dove ogni componente chiama direttamente gli altri tramite API sincrone — il servizio ordini contiene la logica di comunicazione verso quattro sistemi diversi. Se il servizio di fatturazione è momentaneamente sovraccarico, l'intero flusso dell'ordine si blocca. Se domani aggiungi un quinto consumer, magari un modulo di analytics o un programma fedeltà, devi modificare il codice del servizio ordini, testare tutto e rifare il deploy. Questo legame stretto tra componenti — in gergo tecnico coupling — è la causa principale di sistemi enterprise che diventano rigidi dopo pochi mesi di sviluppo. Un report di Confluent del 2024 mostra che il 67% delle aziende con architetture fortemente accoppiate impiega più di due settimane per rilasciare una singola funzionalità nuova, contro i due-tre giorni di chi adotta modelli reattivi.

L'architettura event-driven ribalta completamente questa dinamica. Il servizio ordini non chiama nessuno: si limita a pubblicare un evento — un messaggio strutturato che dice semplicemente 'è stato creato l'ordine numero 48291, con questi articoli, per questo cliente, a questo indirizzo'. Questo evento finisce in un broker, un intermediario che funziona come una bacheca digitale. Magazzino, fatturazione, spedizione e notifiche sono iscritti ciascuno al proprio canale e consumano l'evento in modo indipendente, nei propri tempi. Se il servizio spedizione va in crash, gli eventi restano nella coda e vengono processati appena torna operativo, senza che il servizio ordini ne sia minimamente consapevole. Aggiungere un nuovo consumer — quel modulo di analytics che il marketing chiede da mesi — diventa un'operazione che non tocca nemmeno una riga del producer. Il disaccoppiamento è totale e porta con sé un vantaggio meno ovvio: ogni evento è un fatto immutabile, un record storico di qualcosa che è accaduto. Questo crea un audit trail naturale, prezioso per la compliance normativa e per il debug di problemi in produzione.

La scelta del broker dipende dal contesto aziendale e dal volume di dati. Apache Kafka è lo standard de facto per scenari ad alto throughput: gestisce milioni di eventi al secondo con garanzie di durabilità — i messaggi vengono scritti su disco e replicati su più nodi, quindi non si perdono. Il prezzo è la complessità operativa: servono competenze specifiche per configurare partizioni, gestire il bilanciamento dei consumer e monitorare i cluster. Per una PMI con volumi più contenuti, RabbitMQ rappresenta un'alternativa pragmatica: è più semplice da installare, ha un'interfaccia di gestione intuitiva e supporta pattern di routing sofisticati con overhead operativo ridotto. Chi opera già su AWS può considerare EventBridge combinato con SNS e SQS, una soluzione completamente serverless dove non devi gestire nessun server: paghi solo per gli eventi processati e l'infrastruttura scala automaticamente. Infine, Redis Streams è un'opzione leggera e performante per chi ha già Redis nel proprio stack tecnologico e vuole aggiungere capacità di streaming senza introdurre un nuovo componente. La decisione giusta dipende sempre dal caso specifico, non dalla popolarità della tecnologia.

Pattern che funzionano e trappole da evitare in produzione

L'architettura event-driven non è solo un modo diverso di far comunicare i servizi: abilita pattern architetturali che risolvono problemi concreti delle applicazioni enterprise. Il primo è l'Event Sourcing, un approccio dove lo stato di un'entità non viene salvato come riga aggiornata in un database, ma come sequenza ordinata di tutti gli eventi che lo hanno modificato. Pensa al conto corrente: invece di memorizzare solo il saldo attuale, conservi ogni singola transazione — accrediti, addebiti, commissioni. Il saldo lo ricostruisci sommando gli eventi. Sembra più complesso, e lo è, ma offre vantaggi enormi: puoi ricostruire lo stato a qualsiasi punto nel tempo (perfetto per audit e compliance GDPR), implementare funzionalità di undo senza logica aggiuntiva, e alimentare proiezioni diverse degli stessi dati per scopi diversi. Il secondo pattern è CQRS — Command Query Responsibility Segregation — che in pratica significa usare modelli di dati separati per la scrittura e per la lettura. Quando un utente inserisce un ordine, il comando va su un database ottimizzato per le scritture. Le query di reportistica e ricerca leggono da una proiezione diversa, magari un indice Elasticsearch aggiornato in tempo reale dagli eventi. Un e-commerce italiano che gestivamo aveva tempi di risposta delle pagine catalogo di 4,2 secondi con il database condiviso tra lettura e scrittura: dopo l'adozione di CQRS, i tempi sono scesi a 180 millisecondi.

Il terzo pattern fondamentale è la Saga, che risolve il problema delle transazioni distribuite. In un sistema monolitico, se il pagamento fallisce dopo aver riservato la merce, un rollback del database annulla tutto. Con i microservizi non esiste una transazione unica che attraversa più servizi. La Saga coordina il flusso attraverso una sequenza di eventi: 'ordine creato' innesca 'pagamento richiesto', che produce 'pagamento confermato' o 'pagamento rifiutato'. In caso di fallimento, vengono emessi eventi compensativi — 'rilascia scorta magazzino', 'annulla prenotazione spedizione' — che riportano ogni servizio allo stato corretto. Non servono lock distribuiti, ogni servizio gestisce la propria logica di compensazione. Per i messaggi che falliscono ripetutamente — un pagamento verso un gateway esterno che restituisce sempre errore, per esempio — si usa la dead letter queue: una coda separata dove finiscono gli eventi problematici, che vengono analizzati manualmente o riprocessati con logiche specifiche. In una piattaforma e-commerce italiana che processa circa ventimila ordini giornalieri, questo meccanismo di retry automatico con dead letter queue ha ridotto gli ordini persi dallo 0,8% allo 0,02%, recuperando circa 340 ordini al mese che prima richiedevano intervento manuale del customer service.

Passare a un modello event-driven senza consapevolezza dei rischi porta a disastri altrettanto gravi dell'architettura che si voleva sostituire. Il primo anti-pattern è quello che nel settore chiamiamo event soup: decine di eventi senza uno schema definito, con nomi ambigui e payload che cambiano versione senza preavviso. Dopo sei mesi nessuno sa più quali eventi esistono, chi li produce e chi li consuma. La soluzione è un registry degli schemi — strumenti come Confluent Schema Registry o AWS Glue Schema Registry — che impone contratti formali tra producer e consumer. Il secondo problema è l'ordinamento degli eventi: Kafka garantisce l'ordine solo all'interno di una singola partizione, quindi se distribuite gli eventi di uno stesso ordine su partizioni diverse, potreste processare la spedizione prima del pagamento. La chiave di partizionamento va scelta con cura — tipicamente l'identificativo dell'ordine o del cliente. Il terzo anti-pattern, forse il più insidioso, è la gestione superficiale della consistenza eventuale. In un sistema event-driven i dati non sono immediatamente coerenti ovunque: tra la pubblicazione di un evento e il suo consumo passano millisecondi, a volte secondi. Se l'interfaccia utente non è progettata per gestire questo ritardo, il cliente che ha appena pagato potrebbe vedere il suo ordine ancora in stato 'in attesa di pagamento' e ripetere l'operazione. Serve progettare la UX con feedback immediato — 'il tuo ordine è in elaborazione' — e aggiornamenti asincroni via WebSocket o polling. Questi non sono dettagli: sono le differenze tra un sistema event-driven che funziona e uno che genera più problemi di quanti ne risolva.

Punti chiave

Disaccoppiamento reale tra servizi

Ogni microservizio pubblica eventi senza conoscere chi li consuma. Aggiungere un nuovo consumer — analytics, CRM, notifiche push — non richiede modifiche al codice del producer. Questo elimina le dipendenze a catena che rendono fragili i rilasci e permette a team diversi di evolvere i propri servizi in autonomia.

Resilienza nativa con retry e dead letter queue

Se un consumer è temporaneamente offline, gli eventi restano nel broker e vengono processati al ripristino. I messaggi che falliscono ripetutamente finiscono in una dead letter queue dedicata per analisi e riprocessamento. Il flusso principale non si interrompe mai, anche quando singoli componenti hanno problemi.

Kafka e RabbitMQ: la scelta giusta per ogni scala

Italy Soft progetta architetture event-driven calibrate sulla realtà aziendale: Apache Kafka per scenari ad alto volume con garanzie di durabilità, RabbitMQ o soluzioni serverless come AWS EventBridge per PMI che vogliono semplicità operativa. La tecnologia segue il problema, non il contrario.

Audit trail immutabile e compliance integrata

Ogni evento è un fatto registrato con timestamp, payload e metadati. Combinato con Event Sourcing, questo approccio crea una cronologia completa e inalterabile di ogni operazione. Per settori regolamentati — finanza, sanità, e-commerce con fatturazione elettronica — significa compliance nativa senza sistemi di logging aggiuntivi.

Domande frequenti

Qual è la differenza pratica tra Apache Kafka e RabbitMQ per un sistema aziendale?

L'architettura event-driven è adatta anche a una PMI o serve solo alle grandi enterprise?

Come si gestiscono le transazioni che coinvolgono più microservizi senza un database unico?

Quali sono i rischi principali nell'adottare Event Sourcing in produzione?

Approfondimenti correlati

Altro in questa categoria

Italy Soft

Vuoi i numeri reali per la tua azienda?

In 30 minuti di audit gratuito analizziamo i tuoi processi e calcoliamo il ROI concreto. Nessun impegno.