The Teaching Hub
DB: …

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

ServerEmit CloudEvent minimale
BrokerFan-out verso consumer
ClientFetch dettagli ordine
{ "orderId": "ord_9f3c2a", "changeType": "PLACED" }

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"
  }
}

Lab: notifica leggera + fetch simulato

Dopo l’evento minimale, il client carica lo stato completo (qui mockato). Estendi con batching o cache.

Caricamento playground…