Event Notification
Un segnale leggero (spesso solo ID e tipo) che invita il consumer a recuperare i dettagli via API: alto disaccoppiamento, payload minimi sul bus.
Approfondimento
Definizioni, contesto e collegamenti tra concetti — leggi prima del palcoscenico interattivo se parti da zero.
Event notification: segnale leggero
L’event notification invia un segnale minimale: spesso tipo di cambiamento e identificativi (`orderId`, `customerId`). Il consumer, ricevuto l’evento, decide se e come recuperare lo stato completo tramite API o query dedicata.
Il bus resta snello: meno byte, meno dati sensibili in transito, meno accoppiamento sullo shape del read model. Il prezzo è un round-trip in più verso il servizio di lettura: monitora QPS, cache e rate limit.
Implicazioni su API e UX
Lato UI, combina prefetch, stale-while-revalidate e stati di caricamento espliciti. Dopo una mutazione, non assumere che la lista sia aggiornata: invalida cache o attendi l’evento di conferma sul canale realtime se ne hai uno.
Mitiga il traffico “chatty”: batch di ID, etag/versioning, GraphQL se centralizzi il fetch. Se ogni notifica genera una tempesta di GET, il collo di bottiglia si sposta sul read path.
Affidabilità: transactional outbox
Se scrivi nel database e pubblichi sul broker in due passi separati, puoi avere drift (commit OK, publish fallito). Il pattern transactional outbox scrive l’evento nella stessa transazione del dominio e un relay asincrono lo spinge sul bus: elimina la classe di bug “persi nel mezzo”.
Il relay deve essere idempotente sul verso broker (stesso outbox row non deve duplicare publish): spesso con tracking di `published_at` o offset.
Palcoscenico
Step 0/3 — CloudEvent in transito
Contratto e codice
Schema JSON basato su CloudEvents 1.0, poi snippet server e client.
{
"specversion": "1.0",
"source": "/orders-service",
"id": "550e8400-e29b-41d4-a716-446655440000",
"time": "2026-05-13T12:00:00.000Z",
"datacontenttype": "application/json",
"type": "com.example.order.notification",
"data": {
"orderId": "ord_9f3c2a",
"changeType": "PLACED"
}
}