57
WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 1

WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

WHEN MICROSERVICES MEET EVENT SOURCINGVinicius Gomes

1

Page 2: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

VINICIUS GOMES

Software developer at ThoughtWorks

vvgomes.com/blog

twitter.com/vvgomes

2

Page 3: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGENDA

The Traditional Approach

Introduction to Event Sourcing

CQRS

Demo

Summary

3

Page 4: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

THE TRADITIONAL APPROACH

4

Page 5: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EXAMPLE

Online Restaurant

5

Page 6: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

ONLINE RESTAURANT

Data Model

6

Page 7: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

ONLINE RESTAURANT

Services

7

Page 8: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

Restaurant

ONLINE RESTAURANT

8

📱POST

GET

I want to open an order!

200 ✔

Page 9: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

Restaurant

ONLINE RESTAURANT

9

📱POST

GET

I want to add an item to

my order!

200 ✔

Page 10: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

THE TRADITIONAL APPROACH

• Simple to implement

• Technology agnostic

10

GET POST PUT

DELETE

Page 11: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CHALLENGES

11

Page 12: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CHALLENGES

Coupling

12

Page 13: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CHALLENGES

Coupling

Resilience

13

Restaurant

📱POST

GET

I want to add an item to my order!

503👎

Page 14: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CHALLENGES

Coupling

Resilience

Response time

14

Page 15: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CHALLENGES

Coupling

Resilience

Response time

User intent

15

POST /orders/8659a0d6/items/

Add item to order

Page 16: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EVENT SOURCING

17

Page 18: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EVENT SOURCING

18

Page 19: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EVENT STORE

Append only

Sequential

Long-lived

20

Page 21: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGGREGATES

21

state = reduce(handle, {}, events)

Reducer function

Reducing events into state

Page 22: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGGREGATES

Example

22

{ }

Page 23: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGGREGATES

Example

23

payload: { id: “42” }

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

Page 24: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGGREGATES

Example

26

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

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

} ] }

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

Page 27: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGGREGATES

Example

27

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

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

} ] }

payload: { orderId: “42” }

Page 28: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

AGGREGATES

Example

28

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

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

} ] }

Order Aggregate

Page 29: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

30

(state, command) -> [event]

Handling a command

Page 31: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

31

How do clients send commands?

📱

I want to add an item to my order!

?

Page 32: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

32

Reviewing REST

Resource Collection

host/api/orders

Page 33: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

33

Reviewing REST

Resource

host/api/orders/8659a0d6

Page 34: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

34

Reviewing REST

Nested Resource

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

Page 35: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

35

Reviewing REST

HTTP MethodsGET POST PUT/PATCH DELETE

Page 36: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

36

Reviewing REST

Hypermedia Formats

Page 37: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

37

Commands can be resources

Page 38: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

COMMANDS

Command discoverability

40

Page 41: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EVENT SOURCING

41

Page 42: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

42

Queries?

Page 43: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CQRS

44

Page 45: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

CQRS

Command Query Responsibility Segregation

45

Write ✍

Read 📖

Page 46: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

Service

CQRS

46

📱

Command

Query

Publish

Listen

Page 47: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

Service A

CQRS

47

Service B

Page 48: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

DEMO

49

Page 50: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

DEMO

Online Restaurant

50

Service

Page 51: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

DEMO

Online Restaurant

51

Page 52: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EXAMPLE: ONLINE RESTAURANT

52

Online Restaurant

Publishes Listen to

Page 53: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

EXAMPLE: ONLINE RESTAURANT

53

Online Restaurant

Publishes Listen to

Publishes Listen to

Page 54: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

SUMMARY

55

Page 56: WHEN MICROSERVICES MEET EVENT SOURCING€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

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€¦ · WHEN MICROSERVICES MEET EVENT SOURCING Vinicius Gomes 57. Title: tw-tech-talks-2017-05-11 copy.key Created Date: 6/21/2017 7:00:47 PM

WHEN MICROSERVICES MEET EVENT SOURCINGVinicius Gomes

57