What if you could rewind time and see every step your system took to reach its current state?
Why Event sourcing in HLD? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine you run a busy store and keep track of every sale by writing it down on paper. When you want to know how much money you made, you have to add up all those notes manually.
This manual way is slow and mistakes happen easily. If you lose a paper or forget to write something, your records are wrong. Also, fixing errors means digging through piles of notes, which is frustrating and time-consuming.
Event sourcing changes this by saving every action (or event) as it happens in a clear, ordered list. Instead of just the final result, you keep the full story. This makes it easy to check, fix, or replay events to understand exactly what happened.
balance = 0 for sale in sales: balance += sale.amount
events = [] for event in event_stream: apply(event, state)
With event sourcing, you can rebuild your system's state anytime and track every change, making your data reliable and easy to audit.
Think of a bank that records every deposit and withdrawal as an event. If there's a dispute, they can replay all events to see exactly how the balance changed over time.
Manual record-keeping is slow and error-prone.
Event sourcing stores every change as an event, preserving history.
This approach improves reliability, debugging, and auditing.
Practice
event sourcing in system design?Solution
Step 1: Understand event sourcing concept
Event sourcing means saving every change as an event, not just the final data.Step 2: Identify how state is managed
The current state is rebuilt by applying all stored events in order, not by snapshots alone.Final Answer:
Store all changes as a sequence of events to reconstruct state -> Option AQuick Check:
Event sourcing = store events to rebuild state [OK]
- Confusing event sourcing with snapshot-only storage
- Thinking events are only for error logs
- Believing events are just notifications
Solution
Step 1: Identify proper event structure
Events should be structured data with type, timestamp, and data fields for clarity and processing.Step 2: Compare options
{ "eventType": "UserCreated", "timestamp": "2024-06-01T12:00:00Z", "data": { "userId": 123 } } uses a clear JSON object with eventType, timestamp, and data, which is standard practice.Final Answer:
{ "eventType": "UserCreated", "timestamp": "2024-06-01T12:00:00Z", "data": { "userId": 123 } } -> Option AQuick Check:
Event = structured JSON with type and data [OK]
- Using unstructured strings for events
- Confusing event data with SQL commands
- Using arrays without keys for event details
[{"eventType":"AddItem","data":{"itemId":1}}, {"eventType":"AddItem","data":{"itemId":2}}, {"eventType":"RemoveItem","data":{"itemId":1}}]What is the final state of the item list?
Solution
Step 1: Apply events in order to the item list
Start with empty list. Add item 1 -> [1]. Add item 2 -> [1, 2]. Remove item 1 -> [2].Step 2: Determine final list content
After all events, only item 2 remains in the list.Final Answer:
[2] -> Option BQuick Check:
Apply events sequentially = final list [2] [OK]
- Ignoring remove event
- Applying events out of order
- Assuming all added items remain
Solution
Step 1: Identify performance issue cause
Replaying all events from the start can be slow as event count grows.Step 2: Choose common optimization
Snapshots save the full state at points in time, so replay starts from snapshot, reducing replay time.Final Answer:
Use snapshots to save intermediate states periodically -> Option CQuick Check:
Snapshots speed up event replay [OK]
- Deleting events breaks history and audit
- Keeping only latest event loses full history
- Abandoning events loses event sourcing benefits
Solution
Step 1: Understand concurrency challenges in event sourcing
Concurrent transactions can cause conflicts if events overwrite each other or are applied out of order.Step 2: Choose method to maintain consistency and audit
Optimistic concurrency control uses event version numbers to detect conflicts and prevent overwrites, preserving history and correctness.Final Answer:
Use optimistic concurrency control with event versioning and conflict detection -> Option DQuick Check:
Optimistic concurrency = safe concurrent event handling [OK]
- Ignoring conflicts causes data corruption
- Dropping event history loses audit trail
- Processing events unordered breaks state correctness
