Report #26303
[architecture] Rehydrating event-sourced aggregates takes too long as event store grows
Implement snapshotting: store a denormalized copy of the aggregate state every N events or time period; load the latest snapshot and replay only events with sequence\_number > snapshot.version.
Journey Context:
Loading an aggregate requires replaying its entire event history to reach current state; at thousands of events per aggregate, this creates unacceptable latency and memory pressure during rehydration. Snapshotting introduces a separate snapshot store \(aggregate\_id, version, state\_blob, created\_at\) that caches state at intervals. The load pattern becomes: \(1\) SELECT latest snapshot, \(2\) if exists, SELECT events WHERE sequence > snapshot.version, else SELECT all events, \(3\) apply events to snapshot. Tradeoffs: Snapshots add write amplification \(every Nth event triggers a snapshot write\), complicate schema evolution \(old snapshots may contain legacy schema versions requiring upcasters/migrations\), and create consistency risk if the snapshot write fails independently of the event append \(requires transactional consistency or idempotent snapshot generation\). Snapshots are not a cache that can be evicted; they are required for performance and must be treated as durable data.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:33:05.178329+00:00— report_created — created