WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 1 - - PowerPoint PPT Presentation

when microservices meet event sourcing
SMART_READER_LITE
LIVE PREVIEW

WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 1 - - PowerPoint PPT Presentation

WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 1 VINICIUS GOMES Software developer at ThoughtWorks vvgomes.com/blog twitter.com/vvgomes 2 AGENDA The Traditional Approach Introduction to Event Sourcing CQRS Demo Summary 3 THE


slide-1
SLIDE 1

WHEN MICROSERVICES MEET EVENT SOURCING

Vinicius Gomes

1

slide-2
SLIDE 2

VINICIUS GOMES

Software developer at ThoughtWorks vvgomes.com/blog twitter.com/vvgomes

2

slide-3
SLIDE 3

AGENDA The Traditional Approach Introduction to Event Sourcing CQRS Demo Summary

3

slide-4
SLIDE 4

THE TRADITIONAL APPROACH

4

slide-5
SLIDE 5

EXAMPLE

Online Restaurant

5

slide-6
SLIDE 6

ONLINE RESTAURANT

Data Model

6

slide-7
SLIDE 7

ONLINE RESTAURANT

Services

7

slide-8
SLIDE 8

Restaurant

ONLINE RESTAURANT

8

📲

POST G E T

I want to

  • pen an order!

200 ✔

slide-9
SLIDE 9

Restaurant

ONLINE RESTAURANT

9

📲

POST GET

I want to add an item to my order!

200 ✔

slide-10
SLIDE 10

THE TRADITIONAL APPROACH

  • Simple to implement
  • Technology agnostic

10

GET POST PUT DELETE

slide-11
SLIDE 11

CHALLENGES

11

slide-12
SLIDE 12

CHALLENGES

Coupling

12

slide-13
SLIDE 13

CHALLENGES

Coupling Resilience

13

Restaurant

📲

POST GET

I want to add an item to my order!

503👏

slide-14
SLIDE 14

CHALLENGES

Coupling Resilience Response time

14

slide-15
SLIDE 15

CHALLENGES

Coupling Resilience Response time User intent

15

POST /orders/8659a0d6/items/

Add item to order

slide-16
SLIDE 16

CHALLENGES

Coupling Resilience Response time User intent Current / mutable state

16

{ "id": “6a208c41…”, "status": "OPEN", "items": [ { "id": “be596c8e…”, "quantity": 1 }, { "id": “5d09509c…”, "quantity": 2 }, { "id": “cc52d1b6…”, "quantity": 1 } ] }

slide-17
SLIDE 17

EVENT SOURCING

17

slide-18
SLIDE 18

EVENT SOURCING

18

slide-19
SLIDE 19

DOMAIN EVENTS

19

{ "payload": { "orderId": “be596c8e…”, "itemId": “5d09509c…”, "quantity": 1 }, "payloadType": “com.restaurant.ItemAddedToOrderEvent”, "timestamp": “2017-03-25 08:48:51 -03:00”, "revision": “2”, "aggregateId": “6a208c41…” }

Model the past Immutable Permanent

slide-20
SLIDE 20

EVENT STORE

Append only Sequential Long-lived

20

slide-21
SLIDE 21

AGGREGATES

21

state = reduce(handle, {}, events)

Reducer function

Reducing events into state

slide-22
SLIDE 22

AGGREGATES

Example

22

{ }

slide-23
SLIDE 23

AGGREGATES

Example

23

payload: { id: “42” }

{ "id": “42”, "status": "OPEN", "items": [ ] }

slide-24
SLIDE 24

AGGREGATES

Example

24

{ "id": “42”, "status": "OPEN", "items": [ { "id": “43”, “quantity": 1 } ] }

payload: {

  • rderId: “42”,

itemId: “43”, quantity: 1 }

slide-25
SLIDE 25

payload: {

  • rderId: “42”,

itemId: “44”, quantity: 2 }

AGGREGATES

Example

25

{ "id": “42”, "status": "OPEN", "items": [ { "id": “43”, “quantity": 1 }, { "id": “44”, “quantity": 2 } ] }

slide-26
SLIDE 26

AGGREGATES

Example

26

{ "id": “42”, "status": "OPEN", "items": [ { "id": “44”, “quantity": 2 } ] }

payload: {

  • rderId: “42”,

itemId: “43” }

slide-27
SLIDE 27

AGGREGATES

Example

27

{ "id": “42”, "status": "PLACED", "items": [ { "id": “44”, “quantity": 2 } ] }

payload: {

  • rderId: “42”

}

slide-28
SLIDE 28

AGGREGATES

Example

28

{ "id": “42”, "status": "PLACED", "items": [ { "id": “44”, “quantity": 2 } ] }

Order Aggregate

slide-29
SLIDE 29

COMMANDS

29

Add item to order

{ "type": “com.restaurant.AddItemToOrderCommand”, "payload": { "orderId": “be596c8e…”, "itemId": “5d09509c…”, "quantity": 1 }, "timestamp": “2017-03-25 08:48:51 -03:00” }

slide-30
SLIDE 30

COMMANDS

30

(state, command) -> [event]

Handling a command

slide-31
SLIDE 31

COMMANDS

31

How do clients send commands?

📲

I want to add an item to my order!

?

slide-32
SLIDE 32

COMMANDS

32

Reviewing REST

Resource Collection

host/api/orders

slide-33
SLIDE 33

COMMANDS

33

Reviewing REST

Resource

host/api/orders/8659a0d6

slide-34
SLIDE 34

COMMANDS

34

Reviewing REST

Nested Resource

host/api/orders/8659a0d6/items/5d1a8457

slide-35
SLIDE 35

COMMANDS

35

Reviewing REST

HTTP Methods

GET POST PUT/PATCH DELETE

slide-36
SLIDE 36

COMMANDS

36

Reviewing REST

Hypermedia Formats

slide-37
SLIDE 37

COMMANDS

37

Commands can be resources

slide-38
SLIDE 38

COMMANDS

Option #1 Generic “Commands” nested-resource

38

POST /orders/8659a0d6/commands

{ “type": “AddItemToOrderCommand”, "menuItem": “/menu/items/8d30d99“, “quantity": 2 }

slide-39
SLIDE 39

COMMANDS

Option #2 Command URI

39

POST /orders/8659a0d6/items/commands/add

{ "menuItem": “/menu/items/8d30d99“, “quantity": 2 }

slide-40
SLIDE 40

COMMANDS

Command discoverability

40

slide-41
SLIDE 41

EVENT SOURCING

41

slide-42
SLIDE 42

42

Queries?

slide-43
SLIDE 43

QUERIES

Bad news 😕 The Event Store is not good for queries

43

Most applications

  • A few writes
  • A lot of reads
slide-44
SLIDE 44

CQRS

44

slide-45
SLIDE 45

CQRS

Command Query Responsibility Segregation

45

Write ✍ Read 📗

slide-46
SLIDE 46

Service

CQRS

46

📲

Command Query Publish L i s t e n

slide-47
SLIDE 47

Service A

CQRS

47

Service B

slide-48
SLIDE 48

CQRS

48

Command model

  • Command definitions
  • Event definitions
  • The aggregate
  • Aggregate repository
  • Write only API

Query model

  • Event listeners
  • Query entities
  • Repositories
  • Read only API
slide-49
SLIDE 49

DEMO

49

slide-50
SLIDE 50

DEMO

Online Restaurant

50

Service

slide-51
SLIDE 51

DEMO

Online Restaurant

51

slide-52
SLIDE 52

EXAMPLE: ONLINE RESTAURANT

52

Online Restaurant

Publishes Listen to

slide-53
SLIDE 53

EXAMPLE: ONLINE RESTAURANT

53

Online Restaurant

Publishes Listen to P u b l i s h e s L i s t e n t

slide-54
SLIDE 54

TECHNOLOGIES

Java Spring Boot Axon Framework Spring Data REST RabbitMQ

54

https://github.com/vvgomes/event-driven-restaurant

slide-55
SLIDE 55

SUMMARY

55

slide-56
SLIDE 56

MICROSERVICES + EVENT SOURCING Benefits

  • History based queries
  • Audit log by design
  • Immutability
  • User intent
  • Decoupling
  • Resilience

56

Challenges

  • Complexity
  • Snapshots
  • Upcasting
  • Race conditions
  • Event contracts
  • Eventual consistency
slide-57
SLIDE 57

WHEN MICROSERVICES MEET EVENT SOURCING

Vinicius Gomes

57