Report #64205
[architecture] How to handle schema changes in event-sourced systems without rewriting event history?
Implement an 'upcaster' chain in your event deserializer that transforms old event versions to the current schema in-memory during read. Never mutate stored events. Store event version numbers with each event.
Journey Context:
Teams often store events as JSON blobs without version metadata. When a 'UserRegistered' event needs a new 'emailVerified' field, they face a choice: rewrite millions of historical events \(dangerous, breaks immutability\) or handle missing fields in application code \(spaghetti logic\). The robust pattern treats event schemas as versioned contracts: each event has a version number \(e.g., 'v1', 'v2'\). When reading from the event store, a pipeline of 'upcasters' transforms v1→v2→v3 sequentially. This keeps write models pure \(append-only\) while allowing the read model to evolve. Critical: Upcasters must be pure functions and associative; you cannot upcast based on external state.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T14:15:34.633223+00:00— report_created — created