An Introduction to event sourcing and CQRS

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

Transcript of 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

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

11

Event Sourcing

In many domains Commands ≃ Events

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

What about reads?

15Lorenzo 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

19

Not a new idea

Specialised Downstream

Lorenzo Nicora Intro to Event Sourcing and CQRS

20

CQRS and Event Sourcing

Lorenzo Nicora Intro to Event Sourcing and CQRS

21

Materialised Views (of current State)

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

26

Indexes

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

28

Hybrid solutions

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

32

Lessonfrom the Trenches

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

+++ Summing up +++

36Lorenzo 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

That’s all, Folks!

40Lorenzo Nicora Intro to Event Sourcing and CQRS

??? Questions ???

41

Thanks.

Lorenzo Nicora Intro to Event Sourcing and CQRS