Top Banner
A visual introduction to Event Sourcing and CQRS 1 @nicusX https://opencredo.com/author/lorenzo/ Lorenzo Nicora Senior Consultant @ OpenCredo
41

An Introduction to event sourcing and CQRS

Apr 16, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: An Introduction to event sourcing and CQRS

A visual introduction to

Event Sourcing and CQRS

1

@nicusX https://opencredo.com/author/lorenzo/

Lorenzo Nicora Senior Consultant @ OpenCredo

Page 2: An Introduction to event sourcing and CQRS

2

A couple of concepts from DDD

Aggregate

(Current) State of the Aggregate

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 3: An Introduction to event sourcing and CQRS

3

Once upon a time…

Everything is synchronous

Request - ResponseLorenzo Nicora Intro to Event Sourcing and CQRS

Page 4: An Introduction to event sourcing and CQRS

4

Scaling up…

Updates —> Locks —> Contention!<— Block <—

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 5: An Introduction 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

Page 6: An Introduction 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

Page 7: An Introduction 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

Page 8: An Introduction 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

Page 9: An Introduction 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

Page 10: An Introduction to event sourcing and CQRS

10

Command > Event Sourcing💡

Think a little, Write, Think later

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 11: An Introduction to event sourcing and CQRS

11

Event Sourcing

In many domains Commands ≃ Events

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 12: An Introduction 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

Page 13: An Introduction 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

Page 14: An Introduction 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

Page 15: An Introduction to event sourcing and CQRS

What about reads?

15Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 16: An Introduction 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

Page 17: An Introduction 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

Page 18: An Introduction 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

Page 19: An Introduction to event sourcing and CQRS

19

Not a new idea

Specialised Downstream

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 20: An Introduction to event sourcing and CQRS

20

CQRS and Event Sourcing

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 21: An Introduction to event sourcing and CQRS

21

Materialised Views (of current State)

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 22: An Introduction 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

Page 23: An Introduction 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

Page 24: An Introduction 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

Page 25: An Introduction 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

Page 26: An Introduction to event sourcing and CQRS

26

Indexes

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 27: An Introduction 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

Page 28: An Introduction to event sourcing and CQRS

28

Hybrid solutions

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 29: An Introduction 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

Page 30: An Introduction to event sourcing and CQRS

30

Eventual (Business) Consistency

Guess —> Compensate —> Apologies

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 31: An Introduction 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

Page 32: An Introduction to event sourcing and CQRS

32

Lessonfrom the Trenches

Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 33: An Introduction 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

Page 34: An Introduction 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

Page 35: An Introduction 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

Page 36: An Introduction to event sourcing and CQRS

+++ Summing up +++

36Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 37: An Introduction 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

Page 38: An Introduction 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

Page 39: An Introduction 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

Page 40: An Introduction to event sourcing and CQRS

That’s all, Folks!

40Lorenzo Nicora Intro to Event Sourcing and CQRS

Page 41: An Introduction to event sourcing and CQRS

??? Questions ???

41

Thanks.

Lorenzo Nicora Intro to Event Sourcing and CQRS