104
Jonas Bonér CTO Typesafe @jboner Go Reactive Building Responsive, Resilient, Elastic & Message-Driven Systems

Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Embed Size (px)

Citation preview

Page 1: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Jonas Bonér CTO Typesafe

@jboner

Go ReactiveBuilding Responsive, Resilient,

Elastic & Message-Driven Systems

Page 2: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 3: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The rules of the game

have changed

Page 4: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Page 5: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Page 6: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Page 7: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Expensive RAM Cheap RAM

Page 8: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Expensive RAM Cheap RAM

Expensive disk Cheap disk

Page 9: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Expensive RAM Cheap RAM

Expensive disk Cheap disk

Slow networks Fast networks

Page 10: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Expensive RAM Cheap RAM

Expensive disk Cheap disk

Slow networks Fast networks

Few concurrent users Lots of concurrent users

Page 11: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Expensive RAM Cheap RAM

Expensive disk Cheap disk

Slow networks Fast networks

Few concurrent users Lots of concurrent users

Small data sets Large data sets

Page 12: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

3

Yesterday Today

Single machines Clusters of machines

Single core processors Multicore processors

Expensive RAM Cheap RAM

Expensive disk Cheap disk

Slow networks Fast networks

Few concurrent users Lots of concurrent users

Small data sets Large data sets

Latency in seconds Latency in milliseconds

Page 13: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 14: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Reactive “Readily responsive to a stimulus”

- Merriam Webster

Page 15: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Reactive  Applications

The Principles of Reactive Systems

6

Page 16: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 17: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

http://reactivemanifesto.org

Page 18: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Responsive “Quick to respond or react appropriately”

- Merriam Webster

Page 19: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

9

The system should always be responsive

Page 20: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

9

1. Blue skies2. Heavy load3. Failures

The system should always be responsive

Page 21: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Resilient “The ability of a substance or object to spring back into shape”

“The capacity to recover quickly from difficulties” - Merriam Webster

Page 22: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Think Vending Machine

Page 23: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Think Vending Machine

Page 24: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Think Vending Machine

Page 25: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Add more coins

Think Vending Machine

Page 26: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Gets coffee

Add more coins

Think Vending Machine

Page 27: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Think Vending Machine

Page 28: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Think Vending Machine

Page 29: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Think Vending Machine

Out of coffee beans error

Page 30: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Think Vending Machine

Out of coffee beans error

WRONG

Page 31: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Think Vending Machine

Page 32: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Inserts coins

Out of coffee beans

failure

Think Vending Machine

Page 33: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Service Guy

Inserts coins

Out of coffee beans

failure

Think Vending Machine

Page 34: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Service Guy

Inserts coins

Out of coffee beans

failure

Adds more beans

Think Vending Machine

Page 35: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Coffee Machine

Programmer

Service Guy

Inserts coins

Gets coffee

Out of coffee beans

failure

Adds more beans

Think Vending Machine

Page 36: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Page 37: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Request

Page 38: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Request

Response

Page 39: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Request

Response

Validation Error

Page 40: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Request

Response

Validation Error

Application Failure

Page 41: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Supervisor

Request

Response

Validation Error

Application Failure

Page 42: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Right Way

ServiceClient

Supervisor

Request

Response

Validation Error

Application Failure

Manages Failure

Page 43: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 44: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Resilience IsBy Design

Page 45: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 46: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

1. Isolate the failure

2. Compartmentalize

3. Manage failure locally

4. Avoid cascading failures

Use Bulkheads

Page 47: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

1. Isolate the failure

2. Compartmentalize

3. Manage failure locally

4. Avoid cascading failures

Use Bulkheads

Page 48: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Enter Supervision

Page 49: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

A

B

BarFoo

C

BE

A

D

C

Automatic and mandatory supervisionSupervisor hierarchies

Page 50: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

A

B

BarFoo

C

E

A

D

C

Automatic and mandatory supervisionSupervisor hierarchies

B

Page 51: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

19

Every single actor has a default supervisor strategy. Which is usually sufficient. But it can be overridden.

Supervision in Akka

Page 52: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

19

class Supervisor extends AbstractActor { private SupervisorStrategy strategy = new OneForOneStrategy( 10, Duration.create(1, TimeUnit.MINUTES), DirectiveBuilder. match(ArithmeticException.class, e -> resume()). match(NullPointerException.class, e -> restart()). matchAny( e -> escalate()). build()); … // rest of actor omitted

} }

Supervision in Akka

Page 53: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 54: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Resilience requires aMessage-DrivenArchitecture

Page 55: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Elastic “Capable of ready change or easy expansion or contraction”

- Merriam Webster

Page 56: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

UPScale

Page 57: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

UPScale

and down

Page 58: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

1. Minimize Contention 2. Maximize Locality of Reference

23

We need to

Page 59: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Common points of

24

ApplicationPhysical

contention

Page 60: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

25

GO

Page 61: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Async

25

GO

Page 62: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

26

Neverever

Page 63: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

26

Neverever

Page 64: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Block

26

Neverever

Page 65: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

27

NOTHINGshare

Page 66: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

28

Needs to be async and non-blocking all the way down…

Page 67: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

28

Needs to be async and non-blocking all the way down…

Page 68: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

29

Single Writer Principle

Page 69: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

29

Single Writer PrincipleIO deviceProducers

SERIAL & CONTENDED

Page 70: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

29

Single Writer PrincipleIO deviceProducers

SERIAL & CONTENDED

IO deviceProducers Actor or Queue

BATCHED & UNCONTENDED

Page 71: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Role of Immutable State

30

Page 72: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Role of Immutable State

30

Page 73: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Role of Immutable State• Great to represent facts • Messages and Events

• Database snapshots

• Representing the succession of time

30

Page 74: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The Role of Immutable State• Great to represent facts • Messages and Events

• Database snapshots

• Representing the succession of time

• Mutable State is ok if local and contained • Allows Single-threaded processing

• Allows single writer principle

• Feels more natural

• Publish the results to the world as Immutable State

30

Page 75: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Divide & Conquer

31

Page 76: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

32

Pipelining

Page 77: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

ON DEMAND

33

scale

Page 78: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

OUTScale

Page 79: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

OUTScale

and in

Page 80: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

• Mobile

• Cloud Services, REST etc.

• NOSQL DBs

• Big Data

35

Distributed Computing is the

new normal

Page 81: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

What is the essence of distributed systems?

36

Page 82: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

What is the essence of distributed systems?

To try to overcome that1. Information travels at the speed of light

2. Independent things fail independently

36

Page 83: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Slow node

Dead node

No difference

37

and a

Between a

Page 84: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The network is

38

Page 85: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

The network is

38

http://aphyr.com/posts/288-the-network-is-reliable

Inherently Unreliable

Page 86: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

39

Graveyard of distributed systems

Page 87: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

39

Graveyard of distributed systems• Distributed Shared Mutable State

• EVIL (where N is number of nodes)N

Page 88: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

39

Graveyard of distributed systems• Distributed Shared Mutable State

• EVIL (where N is number of nodes)N

• Serializable Distributed Transactions

Page 89: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

39

Graveyard of distributed systems• Distributed Shared Mutable State

• EVIL (where N is number of nodes)N

• Serializable Distributed Transactions

• Synchronous RPC

Page 90: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

39

Graveyard of distributed systems• Distributed Shared Mutable State

• EVIL (where N is number of nodes)N

• Serializable Distributed Transactions

• Synchronous RPC

• Guaranteed Delivery

Page 91: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

39

Graveyard of distributed systems• Distributed Shared Mutable State

• EVIL (where N is number of nodes)N

• Serializable Distributed Transactions

• Synchronous RPC

• Guaranteed Delivery

• Distributed Objects

• “Sucks like an inverted hurricane” - Martin Fowler

Page 92: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Instead

40

Page 93: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Embrace the Network

Instead

40

and be d

one with itUse

Asynchronous Message Passing

Page 94: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

TRANSPARENCY

41

location

Page 95: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

42

Page 96: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

42

Scaling Up and Out is essentially

the same thing

Page 97: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 98: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Elasticity requires aMessage-DrivenArchitecture

Page 99: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Page 100: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

AsynchronousMessage-Passingis the enabler

Page 101: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

45

Typesafe Reactive Platform

• Actors are lightweight, isolated and and communicate via asynchronous message passing

• Supervision and clustering in support of fault tolerance

• Purely asynchronous and non-blocking web framework

• No container required, no inherent bottlenecks in session management

• Asynchronous and immutable programming constructs

• Composable abstractions enabling simpler concurrency and parallelism

Page 102: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Typesafe Activatorhttp://typesafe.com/platform/getstarted

Page 103: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

47

Finance Internet/Social Media Mfg/Hardware Government Retail

Page 104: Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems

Jonas Bonér CTO Typesafe

@jboner

Go ReactiveBuilding Responsive, Resilient,

Elastic & Message-Driven Systems