57
WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 1

WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

WHEN MICROSERVICES MEET EVENT SOURCINGVinicius Gomes

1

Page 2: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

VINICIUS GOMES

Software developer at ThoughtWorks

vvgomes.com/blog

twitter.com/vvgomes

2

Page 3: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGENDA

The Traditional Approach

Introduction to Event Sourcing

CQRS

Demo

Summary

3

Page 4: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

THE TRADITIONAL APPROACH

4

Page 5: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EXAMPLE

Online Restaurant

5

Page 6: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

ONLINE RESTAURANT

Data Model

6

Page 7: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

ONLINE RESTAURANT

Services

7

Page 8: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

Restaurant

ONLINE RESTAURANT

8

📱POST

GET

I want to open an order!

200 ✔

Page 9: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

Restaurant

ONLINE RESTAURANT

9

📱POST

GET

I want to add an item to

my order!

200 ✔

Page 10: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

THE TRADITIONAL APPROACH

• Simple to implement

• Technology agnostic

10

GET POST PUT

DELETE

Page 11: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CHALLENGES

11

Page 12: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CHALLENGES

Coupling

12

Page 13: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CHALLENGES

Coupling

Resilience

13

Restaurant

📱POST

GET

I want to add an item to my order!

503👎

Page 14: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CHALLENGES

Coupling

Resilience

Response time

14

Page 15: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CHALLENGES

Coupling

Resilience

Response time

User intent

15

POST /orders/8659a0d6/items/

Add item to order

Page 16: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

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 } ] }

Page 17: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EVENT SOURCING

17

Page 18: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EVENT SOURCING

18

Page 19: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

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

Page 20: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EVENT STORE

Append only

Sequential

Long-lived

20

Page 21: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

21

state = reduce(handle, {}, events)

Reducer function

Reducing events into state

Page 22: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

Example

22

{ }

Page 23: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

Example

23

payload: { id: “42” }

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

Page 24: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

Example

24

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

{ "id": “43”, “quantity": 1

} ] }

payload: { orderId: “42”, itemId: “43”, quantity: 1 }

Page 25: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

payload: { orderId: “42”, itemId: “44”, quantity: 2 }

AGGREGATES

Example

25

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

{ "id": “43”, “quantity": 1

}, { "id": “44”, “quantity": 2

} ] }

Page 26: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

Example

26

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

{ "id": “44”, “quantity": 2

} ] }

payload: { orderId: “42”, itemId: “43” }

Page 27: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

Example

27

{ "id": “42”, "status": "PLACED", "items": [

{ "id": “44”, “quantity": 2

} ] }

payload: { orderId: “42” }

Page 28: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

AGGREGATES

Example

28

{ "id": “42”, "status": "PLACED", "items": [

{ "id": “44”, “quantity": 2

} ] }

Order Aggregate

Page 29: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

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”

}

Page 30: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

30

(state, command) -> [event]

Handling a command

Page 31: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

31

How do clients send commands?

📱

I want to add an item to my order!

?

Page 32: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

32

Reviewing REST

Resource Collection

host/api/orders

Page 33: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

33

Reviewing REST

Resource

host/api/orders/8659a0d6

Page 34: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

34

Reviewing REST

Nested Resource

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

Page 35: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

35

Reviewing REST

HTTP MethodsGET POST PUT/PATCH DELETE

Page 36: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

36

Reviewing REST

Hypermedia Formats

Page 37: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

37

Commands can be resources

Page 38: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

Option #1

Generic “Commands” nested-resource

38

POST /orders/8659a0d6/commands

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

Page 39: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

Option #2

Command URI

39

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

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

Page 40: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

COMMANDS

Command discoverability

40

Page 41: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EVENT SOURCING

41

Page 42: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

42

Queries?

Page 43: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

QUERIES

Bad news 😔

The Event Store is not good for queries

43

Most applications

•A few writes

•A lot of reads

Page 44: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CQRS

44

Page 45: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

CQRS

Command Query Responsibility Segregation

45

Write ✍

Read 📖

Page 46: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

Service

CQRS

46

📱

Command

Query

Publish

Listen

Page 47: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

Service A

CQRS

47

Service B

Page 48: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

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

Page 49: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

DEMO

49

Page 50: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

DEMO

Online Restaurant

50

Service

Page 51: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

DEMO

Online Restaurant

51

Page 52: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EXAMPLE: ONLINE RESTAURANT

52

Online Restaurant

Publishes Listen to

Page 53: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

EXAMPLE: ONLINE RESTAURANT

53

Online Restaurant

Publishes Listen to

Publishes Listen to

Page 54: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

TECHNOLOGIES

Java

Spring Boot

Axon Framework

Spring Data REST

RabbitMQ

54

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

Page 55: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

SUMMARY

55

Page 56: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

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

Page 57: WHEN MICROSERVICES MEET EVENT SOURCING · MICROSERVICES + EVENT SOURCING Benefits •History based queries •Audit log by design •Immutability •User intent •Decoupling •Resilience

WHEN MICROSERVICES MEET EVENT SOURCINGVinicius Gomes

57