Building Event Driven Services with Stateful Streams

126
Building Event Driven Services with Stateful Streams Ben Stopford @benstopford

Transcript of Building Event Driven Services with Stateful Streams

Page 1: Building Event Driven Services with Stateful Streams

1

Building Event Driven Services with Stateful Streams

Ben Stopford @benstopford

Page 2: Building Event Driven Services with Stateful Streams

2

Microservice are an evolution

Page 3: Building Event Driven Services with Stateful Streams

3

Distributed Applications

Page 4: Building Event Driven Services with Stateful Streams

4

Apply the Single Responsibility Principal

Page 5: Building Event Driven Services with Stateful Streams

5

Service-Based Application

Orders Service

Basket Service

Payment Service

Fulfillment Service

Stock Service

Page 6: Building Event Driven Services with Stateful Streams

6

Release together

Orders Service

Validation Service

Payment Service

Fulfillment Service

Stock Service

Page 7: Building Event Driven Services with Stateful Streams

7

Microservices are Independently Deployable

Page 8: Building Event Driven Services with Stateful Streams

8

Independently Deployable

Orders Service

Validation Service

Payment Service

Fulfillment Service

Stock Service

Page 9: Building Event Driven Services with Stateful Streams

9

Service can have different release schedules

Services Released Together

Services Released Independently

Stock

Orders

Payment

Stock

Orders

Payment

Page 10: Building Event Driven Services with Stateful Streams

10

Allows us to scale

Page 11: Building Event Driven Services with Stateful Streams

11

Scale in people terms

Page 12: Building Event Driven Services with Stateful Streams

12

Microservices

•  Single Responsibility •  Fine grained •  Modularized •  Independently deployable •  Run by different teams

Page 13: Building Event Driven Services with Stateful Streams

13

When it comes to data, microservices promote independence.

Page 14: Building Event Driven Services with Stateful Streams

14

Stateful services have their own DB

Orders Service

Validation Service

Payment Service

Fulfillment Service

Stock Service

Page 15: Building Event Driven Services with Stateful Streams

15

This makes sense

Page 16: Building Event Driven Services with Stateful Streams

16 Database

Data on inside

Data on outside

Interface amplifies

data

Databases provide a rich point of coupling

Page 17: Building Event Driven Services with Stateful Streams

17

Service A Service B

Service C

So microservices avoid shared databases

Page 18: Building Event Driven Services with Stateful Streams

18

But most business services share the same core stream of facts.

Catalog Authorisation

Page 19: Building Event Driven Services with Stateful Streams

19

Many databases leads to many data islands

Orders Service

Validation Service

Payment Service

Fulfillment Service

Stock Service

Page 20: Building Event Driven Services with Stateful Streams

20

Difficult to compose a joined up view

Page 21: Building Event Driven Services with Stateful Streams

21

Services Evolution

1.0 - SOA 2.0 - Microservices 3.0 - What’s next???

Page 22: Building Event Driven Services with Stateful Streams

22

How do we get to 3.0?

•  Loose Coupling •  Data Enabled •  Event Driven •  Operational Transparency

Page 23: Building Event Driven Services with Stateful Streams

23

How do we get to 3.0?

•  Loose Coupling •  Data Enabled •  Event Driven •  Operational Transparency

Page 24: Building Event Driven Services with Stateful Streams

24

The synchronous world of request response protocols leads to tight, point-to-point

couplings.

Page 25: Building Event Driven Services with Stateful Streams

25

Coupling

A measure of the assumptions two services make about one another when they exchange information.

Frank Laymann

Page 26: Building Event Driven Services with Stateful Streams

26

Change to one service => many dependencies to consider

CHANGE

Page 27: Building Event Driven Services with Stateful Streams

27

Leverage Receiver Driven Flow Control

Page 28: Building Event Driven Services with Stateful Streams

28

UI Orders Service

Stock Service

Payment Provider

Maybe order more stock

Request-Response Model

Page 29: Building Event Driven Services with Stateful Streams

29

UI Orders Service

Stock Service

Repricing Service

Payment Provider

Maybe order more stock

New services must be called explicitly

Page 30: Building Event Driven Services with Stateful Streams

30

UI Orders Service

Stock Service

Payment Provider

Maybe order more stock

Event Driven Model with Broker

Page 31: Building Event Driven Services with Stateful Streams

31

UI Orders Service

Stock Service

Payment Provider

Maybe order more stock

Flow Control is Receiver Driven: Pluggable

Repricing Service

Page 32: Building Event Driven Services with Stateful Streams

32

Events + Brokers Decouple Architectures

Page 33: Building Event Driven Services with Stateful Streams

33

How do we get to 3.0?

•  Loose Coupling •  Data Enabled •  Event Driven •  Operational Transparency

Page 34: Building Event Driven Services with Stateful Streams

34

Useful Grid

Orders Service

Payments Service

Customers Service

We need to join different datasets

Page 35: Building Event Driven Services with Stateful Streams

35

Useful Grid

Orders Service

Payments Service

Customers Service

Need a better way to handle data the data services expose

Page 36: Building Event Driven Services with Stateful Streams

36

How do we get to 3.0?

•  Loose Coupling •  Data Enabled •  Event Driven •  Operational Transparency

Page 37: Building Event Driven Services with Stateful Streams

37

Useful Grid

Orders Payments

Customers

Why Poll when we can Push

Page 38: Building Event Driven Services with Stateful Streams

38

Useful Grid

Orders Service

Payments Service

Customers Service

Streaming leads to being both event driven and data enabled

Event Driven

Data Enabled

Page 39: Building Event Driven Services with Stateful Streams

39

How do we get to 3.0?

•  Loose Coupling •  Data Enabled •  Event Driven •  Operational Transparency

Page 40: Building Event Driven Services with Stateful Streams

40

Distributed Murder Mysteries

Page 41: Building Event Driven Services with Stateful Streams

41

Ledger Service

Loan Validation

Shared Narrative

Fraud Service

History Service

Account Service Account

History

Login Service

Loan Service

A Journal of Service Interactions

Page 42: Building Event Driven Services with Stateful Streams

42

How do we get to 3.0?

•  Loose Coupling •  Data Enabled •  Event Driven •  Operational Transparency

Page 43: Building Event Driven Services with Stateful Streams

43

Tenet 1: Events and Asynchronous processes

better model the way businesses work

Page 44: Building Event Driven Services with Stateful Streams

44

Tenet 2: Services need to design for data-on-the-

outside

Page 45: Building Event Driven Services with Stateful Streams

45

Tenet 3: The measure of a ‘good’ architecture is

it’s ability to evolve

Page 46: Building Event Driven Services with Stateful Streams

46

Steps to Streaming Services

Page 47: Building Event Driven Services with Stateful Streams

47

1. Take Responsibility for the past and evolve

Page 48: Building Event Driven Services with Stateful Streams

48

Stay Simple. Take Responsibility for the past

Browser

Webserver

Page 49: Building Event Driven Services with Stateful Streams

49

Evolve Forwards

Browser

Webserver Orders Service

Page 50: Building Event Driven Services with Stateful Streams

50

2. Raise events. Don’t talk to services.

Page 51: Building Event Driven Services with Stateful Streams

51

Events => Decouple Events == Facts

Page 52: Building Event Driven Services with Stateful Streams

52

Raise events. Don’t talk to services

Browser

Webserver Orders Service

Page 53: Building Event Driven Services with Stateful Streams

53

Order Requested Order

Received

Browser

Webserver

Orders Service

Raise events. Don’t talk to services

Page 54: Building Event Driven Services with Stateful Streams

54

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Raise events. Don’t talk to services

Page 55: Building Event Driven Services with Stateful Streams

55

3. Use Kafka as a Service Backbone

Page 56: Building Event Driven Services with Stateful Streams

56

KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Use Kafka as a Backbone for Events

Page 57: Building Event Driven Services with Stateful Streams

57

KAFKA

- Highly available - Linearly scalable - Load balance consumers - HA consumers

Page 58: Building Event Driven Services with Stateful Streams

58

4. Use CDC to evolve away from legacy

Page 59: Building Event Driven Services with Stateful Streams

59 KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Evolve away from Legacy

Page 60: Building Event Driven Services with Stateful Streams

60 KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Use the Database as a ‘Seam’

Connect

Products

Page 61: Building Event Driven Services with Stateful Streams

61

5. Make use of Schemas

Page 62: Building Event Driven Services with Stateful Streams

62 KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Use Schemas to validate Backwards Compatibility

Connect

Products

Schema Registry

Page 63: Building Event Driven Services with Stateful Streams

63

6. Use the Single Writer Principal

Page 64: Building Event Driven Services with Stateful Streams

64 KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Apply the single writer principal

Connect

Products

Schema Registry

Order Completed

Page 65: Building Event Driven Services with Stateful Streams

65

Single Writer Principal

-  Creates local consistency points in the absence of Global Consistency

-  Makes schema upgrades easier to manage.

Page 66: Building Event Driven Services with Stateful Streams

66

7. Embrace Multi-tenancy

Page 67: Building Event Driven Services with Stateful Streams

67 KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Apply Bandwidth Limits to services

Connect

Products

Schema Registry

Order Completed

100Mb/s

Page 68: Building Event Driven Services with Stateful Streams

68

8. Store Datasets in the Log

Page 69: Building Event Driven Services with Stateful Streams

69

Messaging that Remembers

Orders Customers

Payments Stock

Page 70: Building Event Driven Services with Stateful Streams

70

Rewind and Replay

Rewind

Replay Orders Service

Page 71: Building Event Driven Services with Stateful Streams

71 KAFKA

Order Requested Order

Validated Order

Received

Browser

Webserver

Orders Service

Utilize Whole Datasets

Connect

Products

Schema Registry

Order Completed Repricing

Page 72: Building Event Driven Services with Stateful Streams

72

Compacted Topic: Delete superceded messages that share the same key

K1 K1 K1 K2 K2

K2 K1

V1

V1

V2 V3

V2 V4 V3

Compacted Topics

Page 73: Building Event Driven Services with Stateful Streams

73

Orders Customers

Payments Stock

Single, Shared Source of Truth

Data-on-the-Outside

Page 74: Building Event Driven Services with Stateful Streams

74

But how do you query a log?

Page 75: Building Event Driven Services with Stateful Streams

75

9. Use Materialized Views to Query the Log

Page 76: Building Event Driven Services with Stateful Streams

76

Materialized View

Create via a query (select * from Orders Where Region == ‘USA’)

Base Table

Materialized Views in a DB

Page 77: Building Event Driven Services with Stateful Streams

77

Insert data Materialized View

Create via a query (select * from Orders Where Region == ‘USA’)

Query is rerun on data as it arrives

Base Table

Materialized Views in a DB

Page 78: Building Event Driven Services with Stateful Streams

78

In practice often more complex

select Order.region, count(order.quantity)

from Orders, Product, Customer where Product.group = ‘Houshold’ and Customer.type = external group by Order.region

Orders Product Customer

View

Read Optimized

Page 79: Building Event Driven Services with Stateful Streams

79

Same problem but with services

select Order.region, count(order.quantity)

from Orders, Product, Customer where Product.group = ‘Houshold’ and Customer.type = external group by Order.region

My Service View

Read Optimized

Orders Service

Product Service

Customer Service

Page 80: Building Event Driven Services with Stateful Streams

80

Use Materialized Views, but turned inside out!

Page 81: Building Event Driven Services with Stateful Streams

81

Or Embed Views with the Streams API

Insert data

Kafka Streams

Business Logic

KAFKA

Orders Service

Query in DSL

Page 82: Building Event Driven Services with Stateful Streams

82

On startup: Rewind and Replay

Rewind

Replay

Orders Service

Page 83: Building Event Driven Services with Stateful Streams

83

Data Services: Distributed Materialized View

Kafka

Queryable State API

Service

KStreams View

Page 84: Building Event Driven Services with Stateful Streams

84

Create Views with Connect

DB of choice

Kafka Connect

API Orders Service

Context Boundary

Kafka

Page 85: Building Event Driven Services with Stateful Streams

85

10. Move Data to Code

Page 86: Building Event Driven Services with Stateful Streams

86

High Throughput Data Movement

Service

Service

Service

Service instance 1

Service instance 2

Service instance 3

Service instance 4

Kafka Cluster (many machines)

Page 87: Building Event Driven Services with Stateful Streams

87

Page 88: Building Event Driven Services with Stateful Streams

88

Connect

Order Requested Order

Validated Order

Completed Order

Received

Products

Browser

Webserver

Schema Registry

Orders Service Stock

Stock

Materialize Stock ‘View’ Inside Service

KAFKA

Page 89: Building Event Driven Services with Stateful Streams

89

If messaging Remembers: Views don’t have to!

Page 90: Building Event Driven Services with Stateful Streams

90

11. Take only the data you need today

Page 91: Building Event Driven Services with Stateful Streams

91

Connect

Order Requested Order

Validated Order

Completed Order

Received

Products

Browser

Webserver

Schema Registry

Orders Service Stock

Stock

Take only the data you need!

KAFKA

Page 92: Building Event Driven Services with Stateful Streams

92

Take only the data you need

{“Stock Inventory”: {“Id”: “Foo1234”,“Vendor”: “Foo Industries”,“Description”: “This is a …”, “Delivery Category”: “ND”,“Stock Status”: [

“Items in Stock”: 53,“Items on Order”: 0

]…etc…}

Page 93: Building Event Driven Services with Stateful Streams

93

Data Movement

Be realistic: •  Network is no longer the bottleneck •  Indexing is:

•  In memory indexes help •  Keep datasets focussed

Page 94: Building Event Driven Services with Stateful Streams

94

12. Use the log instead as a ‘database’ (for data-on-the-inside)

Page 95: Building Event Driven Services with Stateful Streams

95

Connect

Order Requested Order

Validated Order

Completed Order

Received

Products

Browser

Webserver

Schema Registry

Orders Service

Reserved Stocks

Stock

Stock

Reserved Stocks

Save Internal State to the Log (Event Sourcing)

KAFKA

Page 96: Building Event Driven Services with Stateful Streams

96

Append state as events

Service

Append

KAFKA

Page 97: Building Event Driven Services with Stateful Streams

97

Rewind and Replay on startup

Rewind

Replay Service

KAFKA

Page 98: Building Event Driven Services with Stateful Streams

98

Connect

Order Requested Order

Validated Order

Completed Order

Received

Products

Browser

Webserver

Schema Registry

Orders Service

Reserved Stocks

Stock

Stock

Reserved Stocks

Order Service Loads Reserved Stocks on Startup

KAFKA

Page 99: Building Event Driven Services with Stateful Streams

99

14. Use Transactions to tie Communication & State together

Page 100: Building Event Driven Services with Stateful Streams

100

OrderRequested (IPad)

2a. Order Validated

2c. Offset Commit 2b. IPad Reserved

Internal State: Stock = 17 Reservations = 2

Tie Events & State with Transactions

Page 101: Building Event Driven Services with Stateful Streams

101

Connect

TRANSACTION

Order Requested Order

Validated Order

Completed Order

Received

Products

Browser

Webserver

Schema Registry

Orders Service

Reserved Stocks

Stock

Stock

Reserved Stocks

Stay Simple. Take Responsibility for the past

KAFKA

Page 102: Building Event Driven Services with Stateful Streams

102

15. Compose Services as a Streaming Pipeline

Page 103: Building Event Driven Services with Stateful Streams

103

(1) Stateless Processor

e.g. - Filter orders by region -  Convert to local domain model -  Simple rule

Page 104: Building Event Driven Services with Stateful Streams

104

(2) Stateless, Data Enabled Processor

Similar to star schema •  Facts are stream •  Dimensions are GKTables

e.g. Enrich Orders with Customer Info & Account details

Stream

GKTable

GKTable

Stream-Table Join

Page 105: Building Event Driven Services with Stateful Streams

105

(3) Gates

e.g. rules engines or event correlation When Order & Payment then …

Stream 1

Window

Window Stream-Stream Join

Stream 2

Page 106: Building Event Driven Services with Stateful Streams

106

(4) Stateful Processor

e.g. - Average order amount by region

- Posting Engine (reverse replace of previous position)

State store backed up to Kafka

Page 107: Building Event Driven Services with Stateful Streams

107

(5) Stream-Aside Pattern

public static void main(…){…}

JVM

Page 108: Building Event Driven Services with Stateful Streams

108

(7) Sidecar Pattern

Page 109: Building Event Driven Services with Stateful Streams

109

Combine them: 1.  Stateless

2.  Data enriched

3.  Gates

4.  Stateful processors

5.  Stream-aside

6.  Sidecar

Page 110: Building Event Driven Services with Stateful Streams

110

Group services into bounded contexts

Page 111: Building Event Driven Services with Stateful Streams

111

Kafka

Kafka

Independently deployable subsystem

Page 112: Building Event Driven Services with Stateful Streams

112

Richer Example

Page 113: Building Event Driven Services with Stateful Streams

113

All order logic, stateless service

Orders-by-Customer view (KStreams + Queryable State API)

UI Service Stream

Maintenance & Monitoring

Highly available, stateful service

UI uses Orders-by-Customer View directly

via Queryable State

History Service pushes data to a local Elastic Search Instance

Orders Service

Derived View

UI joins data Tables & Streams

Fulfillment Service Analytics

Orders Product Custo-mers KTables

KTables KTables

Schemas

Page 114: Building Event Driven Services with Stateful Streams

114

So…

Page 115: Building Event Driven Services with Stateful Streams

115

Good architectures have little to do with this:

Page 116: Building Event Driven Services with Stateful Streams

116

It’s about how systems evolves over time

Page 117: Building Event Driven Services with Stateful Streams

117

Request driven isn’t enough

•  High coupling •  Hard to handle

async flows •  Hard to move and

join datasets.

Page 118: Building Event Driven Services with Stateful Streams

118

Services need to be data enabled

Page 119: Building Event Driven Services with Stateful Streams

119

The decoupling effects of the broker make the architecture pluggable and data enabled

Orders Customers

Payments Stock

Page 120: Building Event Driven Services with Stateful Streams

120

...with a single source of truth

Orders Customers

Payments Stock

Page 121: Building Event Driven Services with Stateful Streams

121

...and many service specific views

Orders Customers

Payments Stock

Page 122: Building Event Driven Services with Stateful Streams

122

… which react to events as they occur

Orders Customers

Payments Stock

Page 123: Building Event Driven Services with Stateful Streams

123

Microservices enabled by a streaming platform

•  Loose coupling •  Data Enabled •  Event Driven •  Operational transparency

Page 124: Building Event Driven Services with Stateful Streams

124

How do we get to 3.0?

•  Loose coupling •  Embrace data •  Event Driven •  Operational transparency

Page 125: Building Event Driven Services with Stateful Streams

125

Thank You @benstopford

https://www.confluent.io/blog/tag/microservices/

Page 126: Building Event Driven Services with Stateful Streams

126

Tips and Tricks

•  Take only the data you need today •  Limit the scope of request response interfaces •  Build small services. Build big ones too. •  Don’t fear the network. Fear the index. •  The Sync-Async divide

•  Pure event driven with event streams and views. •  Map request response to event driven (Leverage CQRS)

•  Too fine-grained services. •  Too much data •  KStreams rebalancing •  Need for automation