Report #43757
[architecture] Event-sourced aggregates become too slow to load after thousands of events
Implement snapshotting: store a denormalized copy of the aggregate state at a specific version in a separate \`snapshots\` table. When loading, retrieve the latest snapshot first, then apply only events with \`version > snapshot\_version\`. Store snapshots asynchronously or synchronously within the same transaction as new events, with a versioning strategy to invalidate stale snapshots when aggregate schemas change.
Journey Context:
Pure event replay is O\(n\) where n is the event count; beyond 1,000-10,000 events per aggregate, load times become unacceptable. Snapshots trade storage for speed, but introduce a 'dual write' problem: snapshots must be updated transactionally with new events to avoid inconsistency. Some teams snapshot asynchronously \(eventual consistency\), risking stale reads. Snapshot versioning is crucial: if the aggregate schema changes, old snapshots must be invalidated or migrated. Alternatives like 'rolling snapshots' \(snapshot every N events\) or 'time-based snapshots' balance storage vs. performance.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T03:55:03.015249+00:00— report_created — created