The Teaching Hub
DB: …

Event Carried State Transfer

Il messaggio trasporta il delta (o lo stato) necessario al consumer per aggiornare il proprio modello senza chiamate aggiuntive: UI più atomica, payload più grandi.

Approfondimento

Definizioni, contesto e collegamenti tra concetti — leggi prima del palcoscenico interattivo se parti da zero.

ECST: stato nel messaggio

Event-Carried State Transfer (ECST) significa che il messaggio contiene abbastanza stato (o un delta significativo) perché il consumer aggiorni il proprio modello senza chiamate aggiuntive. È vicino all’idea REST del trasferimento di stato nella risposta, applicata agli eventi.

Utile quando vuoi repliche locali, UI reattive offline-first, o quando il costo del fetch è alto rispetto al costo del payload. Più stato trasporti, più crescono dimensione messaggi, log e superficie di dati sensibili.

PII, conflitti e versionamento

Ogni campo nel bus può finire in log, mirror e backup: classifica PII, maschera, cifra e applica retention. Definisci una strategia per conflitti: se il consumer ha modificato localmente mentre arriva un ECST, serve una regola (last-write-wins, merge, CRDT, o ricarico forzato).

Versiona il tipo CloudEvent o un campo `schemaversion` nel payload quando rompi compatibilità: i consumer devono poter convivere con più versioni durante il rollout.

Palcoscenico

previous (bus)

{"qty":1,"price":12.5}

current (bus)

{"qty":2,"price":11}

Read model locale (UI)

{"qty":1,"price":12.5}

Prima dell’evento lo snapshot locale coincide con `previous`.

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.profile.updated",
  "data": {
    "userId": "usr_42",
    "previous": { "displayName": "Ada", "avatarUrl": "/a.png" },
    "current": { "displayName": "Ada L.", "avatarUrl": "/b.png" }
  }
}

Lab: merge del delta sul read model

Applica <code>current</code> sullo stato locale senza round-trip. Aggiungi validazione schema se il payload cresce.

Caricamento playground…