Problem
Services that look up data from another service at request time inherit its latency and outages. Thin events force every consumer to call back for details, creating coupling and load spikes.
Also known as: fat events, state replication via events
Include enough entity state in each event that consumers can maintain a local copy and avoid calling the source service.
Services that look up data from another service at request time inherit its latency and outages. Thin events force every consumer to call back for details, creating coupling and load spikes.
With event-carried state transfer, the event is the data feed. A CustomerUpdated event includes the new address and tier, so the billing service never needs to ask.
The trade is explicit: consumers gain autonomy and give up immediate consistency.
Contrast it with the thin notification style, where an event only says that customer 42 changed and consumers must call back. That is simpler on the wire but creates a thundering herd of callbacks and reintroduces runtime coupling. State transfer shifts the cost to storage and to schema discipline.
The owner emits versioned state. Consumers upsert only if the incoming version is newer than their stored one.
event = {type: "CustomerUpdated", id: "c42", version: 7,
data: {tier: "gold", country: "KE"}}
UPSERT customers_copy SET data = :data, version = :v
WHERE id = :id AND version < :v;
Keeping replicas healthy needs tooling. A compacted topic retaining the latest event per key lets a new consumer rebuild by reading from the start. Periodic full snapshots or a reconciliation job compares replica counts and checksums with the source. Decide ownership clearly: only the source service writes the entity, and every copy is read-only.
Medium - broker and local stores
Medium - replay and rebuild tooling
Medium - staleness reasoning
Out-of-order events overwrite newer state with older
Consumer misses events and drifts silently
Sensitive attributes leak into many stores