Store all domain changes as an immutable append-only sequence of events in an event store table. State is never updated in place — it is rehydrated by replaying all events for an aggregate. Aggregates apply each event to reconstruct their current state. Publish events to Kafka after appending to the store for downstream consumers.
The event store is append-only — never update or delete events; they are the permanent record.
Aggregate state is derived by replaying events from the beginning of a stream.
Use snapshots for aggregates with long event histories — store a checkpoint every N events.
Publish events to Kafka after appending so projections and other services can subscribe.
Event sourcing pairs naturally with CQRS — the write model appends events; the read model builds projections.