A visual introduction to
Event Sourcing and CQRS
1
@nicusX https://opencredo.com/author/lorenzo/
Lorenzo Nicora Senior Consultant @ OpenCredo
2
A couple of concepts from DDD
Aggregate
(Current) State of the Aggregate
Lorenzo Nicora Intro to Event Sourcing and CQRS
3
Once upon a time…
Everything is synchronous
Request - ResponseLorenzo Nicora Intro to Event Sourcing and CQRS
4
Scaling up…
Updates —> Locks —> Contention!<— Block <—
Lorenzo Nicora Intro to Event Sourcing and CQRS
5
Let’s go Asynchronous
Pwd —> “secret” Pwd —> “12345” Pwd —> “54321”
Pwd —> “secret” Pwd —> “54321” Pwd —> “12345”
===> Out of Order
Asynchronous, Message-drivenRequest/Response ACID Transaction
Distributed, Message-based —> No order guaranteed
Lorenzo Nicora Intro to Event Sourcing and CQRS
6
Command Sourcing💡
• Append Only —> No Contention • Build State from Command history
Write fast, Think later
K/V Store Distributed
Lorenzo Nicora Intro to Event Sourcing and CQRS
Command “Submit Order!” —> A request (imperative sentence) —> May fail —> May affect multiple Aggregates
7
Commands vs Events
✉
Rebuild Aggregate State from Commands
Lorenzo Nicora Intro to Event Sourcing and CQRS
8
Event “Order submitted” —> Statement of facts (past tense) —> Never fails —> May affect a single Aggregate
✉
Rebuild Aggregate State from Events
Lorenzo Nicora Intro to Event Sourcing and CQRS
9
Commands to Events
(DDD patterns: Aggregate / Process Manager)
X
Y
Z
Lorenzo Nicora Intro to Event Sourcing and CQRS
10
Command > Event Sourcing💡
Think a little, Write, Think later
Lorenzo Nicora Intro to Event Sourcing and CQRS
12
Additional Benefits
EasyEventual Business Consistency
—> Corrective Events
Robust to data corruption (bugs, fat fingers…)
—> Rebuild state ignoring wrong events
Lorenzo Nicora Intro to Event Sourcing and CQRS
13
Additional Benefits
History (for free)
Rebuild State at a point in Time
Lorenzo Nicora Intro to Event Sourcing and CQRS
14
Main Benefit
Scalable —> Append only
-> Fits distributed k/v stores
—> Low-latency writes
—> Allows asynchronous processing
Lorenzo Nicora Intro to Event Sourcing and CQRS
16
Retrieving the State
How do I retrieve the State? “Get details of Order ‘AB123’”
❔
not very efficient, but… …may work
Lorenzo Nicora Intro to Event Sourcing and CQRS
17
Querying (Searching) the State
❓
❓How do query the State?
“Get all Orders delivered to ‘SE1 0NZ’”
❓
❓
Lorenzo Nicora Intro to Event Sourcing and CQRS
18
CQRS
Command Query Responsibility Segregation
💡Separate • Code • muService • Datastore
-> Update -—> Retrieve “Query”
datastore is downstream
Lorenzo Nicora Intro to Event Sourcing and CQRS
22
Materialised Views (of State)
Latest (known) State
(Persistent)Rebuildable from Events
In MemoryK/V Store Graph
… RDBMS
Delayed
💡
Lorenzo Nicora Intro to Event Sourcing and CQRS
23
Materialised View of State
Query a RDBMS?!?
Wasn’t it the old way?
❓
RDBMS is just one of our options: easy to use, easily become a bottleneck
Lorenzo Nicora Intro to Event Sourcing and CQRS
24
Materialised Views of State
* Views are optimised for specific query use cases
—> multiple Views from same Events
* Updated asynchronously, delayed —> to Scale -> may reorder Events
Lorenzo Nicora Intro to Event Sourcing and CQRS
25
Materialised Views of State
* Views can be rebuilt from Events
Event Log is our Source of Truth
* Easy to evolve or fix
—> change or fix logic; rebuild view from events
(not the View)
Lorenzo Nicora Intro to Event Sourcing and CQRS
27
Indexes
Search EnginesK/V Stores
• Optimised for querying (less for retrieving) • Latest State; rebuild on the fly
💡
Lorenzo Nicora Intro to Event Sourcing and CQRS
29
Hybrid solutions: e.g. Snapshots
• Speed up rebuilding the current State • Use recent Events to rebuild up-to-date
💡Long delayed
Lorenzo Nicora Intro to Event Sourcing and CQRS
30
Eventual (Business) Consistency
Guess —> Compensate —> Apologies
Lorenzo Nicora Intro to Event Sourcing and CQRS
31
Eventual Consistency: Sagas
StatefulOut of band
Corrective Command or Event
Saga
Lorenzo Nicora Intro to Event Sourcing and CQRS
33
Lesson Learned #1
If you put data in…
…you will eventuallyhave to get them out!
The “Query” side is not secondary
Lorenzo Nicora Intro to Event Sourcing and CQRS
34
Lessons Learned #2In old days:
normalising one DB to support as many queries as possible
With CQRS: multiple denormalised “data stores”
optimised for different queries
No single “Q” implementation for all your queries
Lorenzo Nicora Intro to Event Sourcing and CQRS
35
Lessons Learned #3
A central, shared Event Storemay not be the best option
No Event-sourced Monolith
Prefer persistence per Bounded-Context
Lorenzo Nicora Intro to Event Sourcing and CQRS
37
ES/CQRS Optimal Use Cases
High Volume Low Latency writes
(big data)
Event Sourcing + CQRS
😋
Out-of-order Commands/Events (IoT)
Lorenzo Nicora Intro to Event Sourcing and CQRS
38
ES/CQRS Drawbacks
x No “One-Size-Fits-All”
—> Multiple “Q” implementations
x Delayed reads
x No ACID Transactions
x Additional complexity (!)
🙁
Lorenzo Nicora Intro to Event Sourcing and CQRS
39
ES/CQRS Benefits
+ No “One-Size-Fits-All” —> “Q” are optimised for use cases
+ Eventual (Business) Consistency
+ History, Temporal queries
+ Robust to data corruption
😀
Lorenzo Nicora Intro to Event Sourcing and CQRS
Top Related