Bird
Raised Fist0
Microservicessystem_design~10 mins

Event sourcing pattern in Microservices - Scalability & System Analysis

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Scalability Analysis - Event sourcing pattern
Growth Table: Event Sourcing Pattern
ScaleUsersEvents per SecondStorage GrowthSystem Changes
Small100 users~10-100 EPSFew MBs per daySingle event store instance, simple replay
Medium10,000 users~1,000-5,000 EPSGBs per dayEvent store clustering, read model caching, snapshotting
Large1,000,000 users~50,000-100,000 EPSTBs per monthEvent store sharding, asynchronous projections, CQRS separation
Very Large100,000,000 usersMillions EPSPetabytes per yearMulti-region event stores, advanced partitioning, archival, strong consistency trade-offs
First Bottleneck

The event store database is the first bottleneck. It must handle high write throughput and fast reads for event replay and projections. As event volume grows, storage I/O and query latency increase, slowing down the system.

Scaling Solutions
  • Horizontal scaling: Add more event store nodes with clustering and partitioning (sharding) by aggregate or event type.
  • Snapshotting: Periodically save aggregate state snapshots to reduce replay time.
  • Read model caching: Use CQRS to separate read models and cache them for fast queries.
  • Asynchronous projections: Build read models asynchronously to reduce write path latency.
  • Archival: Move old events to cheaper storage to keep active event store performant.
  • Multi-region deployment: Distribute event stores geographically to reduce latency and increase availability.
Back-of-Envelope Cost Analysis

At 10,000 EPS, event store needs to handle ~10K writes/sec. A single node can handle ~5K QPS, so at least 3 nodes are needed for redundancy and load.

Storage: Assuming 1 KB per event, 10K EPS means ~864 MB/day. Requires scalable storage solutions.

Bandwidth: 10K EPS * 1 KB = ~10 MB/s write bandwidth, plus read traffic for projections.

Interview Tip

Start by explaining event sourcing basics. Then discuss how event volume grows with users. Identify the event store as the bottleneck. Propose scaling with sharding, snapshotting, and CQRS. Mention trade-offs like eventual consistency and complexity.

Self Check

Your event store database handles 1000 QPS. Traffic grows 10x to 10,000 QPS. What do you do first?

Answer: Add event store nodes and shard events by aggregate or event type to distribute load. Also implement snapshotting to reduce replay overhead.

Key Result
Event sourcing scales well with proper event store partitioning, snapshotting, and CQRS, but the event store database is the first bottleneck as event volume grows.

Practice

(1/5)
1. What is the main idea behind the Event sourcing pattern in microservices?
easy
A. Store all changes as a sequence of events instead of only the current state
B. Store only the latest snapshot of data for faster access
C. Use events only for communication between services, not for storage
D. Store events only when errors occur in the system

Solution

  1. Step 1: Understand event sourcing concept

    Event sourcing means saving every change as an event, not just the final state.
  2. Step 2: Compare options with definition

    Only Store all changes as a sequence of events instead of only the current state correctly describes storing all changes as events, others focus on snapshots or partial use.
  3. Final Answer:

    Store all changes as a sequence of events instead of only the current state -> Option A
  4. Quick Check:

    Event sourcing = storing all changes as events [OK]
Hint: Event sourcing saves every change, not just the final state [OK]
Common Mistakes:
  • Confusing event sourcing with snapshot storage
  • Thinking events are only for communication
  • Believing events are stored only on errors
2. Which of the following is the correct sequence in event sourcing when a user updates their profile?
easy
A. Update state directly, then create an event for the change
B. Send event to other services before updating state
C. Create an event representing the change, then update the state from the event
D. Store the new state without creating any event

Solution

  1. Step 1: Recall event sourcing flow

    In event sourcing, changes are first recorded as events, then state is updated from those events.
  2. Step 2: Match options to flow

    Create an event representing the change, then update the state from the event correctly shows event creation before state update; others do not follow this order.
  3. Final Answer:

    Create an event representing the change, then update the state from the event -> Option C
  4. Quick Check:

    Event first, then state update = Create an event representing the change, then update the state from the event [OK]
Hint: Events come before state updates in event sourcing [OK]
Common Mistakes:
  • Updating state before creating events
  • Skipping event creation
  • Sending events before state is updated
3. Given this simplified event sourcing code snippet, what will be the final user balance?
events = [
  {"type": "Deposit", "amount": 100},
  {"type": "Withdraw", "amount": 30},
  {"type": "Deposit", "amount": 50}
]

balance = 0
for event in events:
    if event["type"] == "Deposit":
        balance += event["amount"]
    elif event["type"] == "Withdraw":
        balance -= event["amount"]
print(balance)
medium
A. 80
B. 150
C. 100
D. 120

Solution

  1. Step 1: Calculate deposits and withdrawals

    Deposits: 100 + 50 = 150; Withdrawals: 30
  2. Step 2: Compute final balance

    Balance = 0 + 150 - 30 = 120
  3. Final Answer:

    120 -> Option D
  4. Quick Check:

    Deposits minus withdrawals = 120 [OK]
Hint: Add deposits, subtract withdrawals to find balance [OK]
Common Mistakes:
  • Adding withdrawals instead of subtracting
  • Ignoring last deposit event
  • Starting balance not zero
4. In an event sourcing system, which issue is caused by missing an event during state reconstruction?
medium
A. System crashes immediately
B. State becomes inconsistent or incorrect
C. Events are duplicated in the event store
D. Commands fail to generate new events

Solution

  1. Step 1: Understand event replay in event sourcing

    State is rebuilt by replaying all events in order.
  2. Step 2: Effect of missing an event

    If an event is missing, the rebuilt state will not reflect all changes, causing inconsistency.
  3. Final Answer:

    State becomes inconsistent or incorrect -> Option B
  4. Quick Check:

    Missing event = incorrect state [OK]
Hint: Missing events cause wrong state, not crashes [OK]
Common Mistakes:
  • Assuming system crashes on missing event
  • Confusing missing event with duplicate events
  • Thinking commands stop working due to missing event
5. You are designing a microservice using event sourcing. To improve performance, you want to avoid replaying all events every time. Which approach is best to achieve this?
hard
A. Use snapshots to save periodic state and replay only recent events
B. Store only the latest event and discard older ones
C. Send all events to other services for processing
D. Update state directly and ignore events after initial load

Solution

  1. Step 1: Identify performance issue in event sourcing

    Replaying all events from the start can be slow as event count grows.
  2. Step 2: Choose solution to reduce replay time

    Snapshots save the current state at intervals, so only recent events need replaying.
  3. Final Answer:

    Use snapshots to save periodic state and replay only recent events -> Option A
  4. Quick Check:

    Snapshots improve replay speed [OK]
Hint: Snapshots speed up state rebuild by reducing event replay [OK]
Common Mistakes:
  • Discarding old events breaks event sourcing
  • Sending all events elsewhere doesn't reduce replay
  • Ignoring events after initial load loses audit trail