Event sourcing - why a dedicated event store?
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Event sourcing is a design pattern in which changes to the application state are stored as a sequence of events. Instead of recording just the current state of the data in a domain, event sourcing captures the state change itself in an immutable log of events. This approach provides a number of technical and business advantages, including improved auditability, traceability, and complex systems state management.
Why a Dedicated Event Store?
A dedicated event store is an optimized storage mechanism designed specifically to handle the append-only, immutable log of events generated by an event sourcing system. While traditional databases focus on storing current state and can technically be used to implement event sourcing, there are compelling reasons to choose a dedicated event store.
- Performance and Scalability: Event stores are optimized for the types of queries that an event-sourced application typically needs to perform. For example, loading all the events relating to a particular entity or across a particular type. The storage structure is optimized for fast append operations and equally efficient read operations for potentially large volumes of data.
- Event Stream Processing: Event stores typically include features to support event stream processing, such as subscriptions and projections. This makes it easier to react to events as they occur or build up complex read models without impacting the writing of new events.
- Tooling and Support: Dedicated event stores often come with tooling specific to managing, troubleshooting, and analyzing event streams. This can include administrative interfaces, monitoring capabilities, and integrations with other event-driven architectures or frameworks.
- Optimized Data Storage: Event stores can also employ event compression and storage strategies tailored to the needs of event sourcing, such as event upcasting, versioning, and snapshots, which can improve performance and manageability.
Technical Explanation and Examples
For instance, consider a banking system where transactions are events. A traditional system would update the account balance directly in the database. In an event-sourced system, each transaction would be recorded as an event:
- Deposit Event:
{ "type": "deposit", "amount": 100, "accountId": "12345" } - Withdrawal Event:
{ "type": "withdrawal", "amount": 50, "accountId": "12345" }
A dedicated event store would retain each of these events. The current state (account balance) can be derived by replaying these events. This capability enables not just viewing the current balance but also how it was derived historically.
Key Benefits in a Table
| Benefit | Description |
| Auditability and Traceability | Every change to the system's state is recorded with a clear historical timeline. |
| Recovery and Debugging | The system can be reconstructed or debugged by replaying events from any point in time. |
| Scalability | Event stores can handle high volumes of write and read loads efficiently. |
| Flexibility | New features and systems can be built around existing events without modifying them. |
Additional Considerations
Querying Capabilities: While event stores excel at storing and retrieving event streams, querying aggregate data or generating complex reports can be challenging. Some systems might require a combination of an event store and a traditional database or use CQRS (Command Query Responsibility Segregation) to separate the write model (using event store) from the read model (using a traditional database or a specialized view store).
Snapshotting: To optimize the process of state rehydration - the process of rebuilding state by replaying events - snapshotting can be used. Snapshots store the state of an entity at a given point in time, reducing the number of events that need to be replayed to reconstruct the current state.
In summary, using a dedicated event store in an event sourcing architecture leverages specialized tools and optimizations that are central to handling the demands and intricacies of event-driven systems effectively. For systems that need high reliability, audit trails, or are designed around complex business workflows, event sourcing with a dedicated event store offers significant advantages.
Related reading
- Event sourcing with Kafka streams
- Eventsourcing in Apache Kafka
- Evicting In-Memory Cache across multiple instances?
- Explain Merkle Trees for use in Eventual Consistency
- Explain replication-offset-checkpoint AND recovery-point-offset in Kafka
- Exposing Kafka as a public API
- Fast Multitenant Caching - Local Caching in Addition to Distributed Caching. Or are they the same thing?
- Fastest way to sync two Amazon S3 buckets

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.