Report #51046
[architecture] Preventing unbounded aggregate rebuild times in Event Sourcing without snapshotting
Implement snapshotting at fixed event-count intervals \(e.g., every 100-1000 events\) storing the aggregate state serialized with a version marker. Rehydrate by loading the latest snapshot then only events after that version. Never load the full event stream for aggregates with >1000 events.
Journey Context:
The pure event-sourcing approach of replaying all events from event 1 is O\(n\) and fails in production when aggregates live for years \(e.g., a bank account with 50k transactions\). Loading 50k events across the network and applying them sequentially causes timeouts and memory pressure. The trigger-based alternative \(snapshot every mutation\) creates write amplification and consistency issues if the snapshot write fails but the event commit succeeds. The interval-based approach \(every N events\) balances read vs write cost. The critical implementation detail is that the snapshot must be treated as a cache, not the source of truth; the system must tolerate snapshot corruption by falling back to full replay. Schema evolution \(upcasting\) must be applied to snapshots if they store versioned state, or the snapshot must be invalidated on schema change. The common mistake is snapshotting too frequently \(every event\), which doubles write latency.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T16:09:51.215653+00:00— report_created — created