Report #47920
[architecture] Event-sourced aggregate roots load too slowly when rebuilding state from millions of historical events
Implement snapshotting: Persist aggregate state every N events \(e.g., every 100\) or time-based; load from latest snapshot then replay only events after that snapshot version.
Journey Context:
Loading an Order aggregate with 5 million status change events to check current status is O\(n\) and unusable. Snapshots trade write performance and storage for read speed. Implementation: Store snapshots in separate table keyed by \(aggregate\_id, version\). Loading: 1\) SELECT latest snapshot, 2\) SELECT events WHERE version > snapshot.version. Snapshots are throwaway; if corrupted, rebuild from event 0. This enables async snapshot creation without locking. Gotcha: Snapshots must include all in-memory derived state, not just persisted fields. Handle 'snapshot gap' where new events arrive during write by always loading events > snapshot.version to catch up.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T10:54:55.039149+00:00— report_created — created