Perché l'Architettura Event-Driven?
L'EDA consente una decoupling rilassata, una decoupling temporale e tracce di audit per impostazione predefinita. Ma introduce anche complessità intorno all'ordinamento, alla consistenza e al trattamento degli errori.
Modelli Fondamentali
1. Notifica di Evento
Il modello più semplice: emiti un evento quando accade qualcosa, lascia che altri servizi reagiscano.
await eventBus.emit("order.created", {
orderId: order.id,
customerId: order.customerId,
items: order.items,
total: order.total
});2. Sorgente di Eventi
Memorizza ogni cambiamento di stato come un evento immutabile. Lo stato corrente è derivato riproducendo gli eventi.
const events = [
{ type: "OrderCreated", data: { items: [...] }, timestamp: "2025-01-15T10:00:00Z" },
{ type: "PaymentReceived", data: { amount: 100 }, timestamp: "2025-01-15T10:05:00Z" },
{ type: "OrderShipped", data: { carrier: "FedEx", tracking: "123" }, timestamp: "2025-01-16T09:00:00Z" }
];3. CQRS (Responsabilità di Comando e Query di Segregazione)
Separare i modelli di lettura e scrittura per esigenze di prestazioni diverse. Il modello di scrittura ottimizza per la consistenza, il modello di lettura ottimizza per le prestazioni delle query.
Scegliere un Broker di Messaggi
| Broker | Miglior per | Compromessi |
|---|---|---|
| RabbitMQ | Routing complesso, affidabilità | Minore throughput rispetto a Kafka |
| Kafka | Alto throughput, sorgenti di eventi | Maggiore complessità operativa |
| SQS/SNS | Coda semplice/pub-sub | Lock-in AWS |
Trattamento degli Errori
- Coda di lettere morte per i messaggi che non possono essere elaborati
- Chiavi di idempotenza per la duplicazione dell'elaborazione
- Barriere di circuito per le fallite dei servizi downstream
- Modello di saga per le transazioni distribuite