Reactieve applicaties; klaar voor de toekomst

Post on 11-May-2015

220 views 5 download

Transcript of Reactieve applicaties; klaar voor de toekomst

Reactieve applicatiesKlaar voor de toekomst

Allard Buijze – allard.buijze@trifork.nl

JFall 2013

Allard Buijze

Software Architect bij Trifork (Amsterdam)

Organsatoren van GOTO & QCON

15 jaar web development ervaring

Gelooft sterk in DDD en CQRS

Ontwikkelaar en initiatiefnemer van Axon Framework

Java Framework voor schaalbaarheid en performance

www.axonframework.org

Een kleine terugblik…

1990

0,3% van Nederland had internettoegang

0.001 PB / Maand data-transfer

2000

40% internettoegang

86 PB / Maand

2012

93% internettoegang

> 30 000 PB / Maand

Waarvan 885 PB / Maand mobiel

Layered architecture

Sinds 1970!

In de jaren 70…

Bron: wikipedia.org

In de jaren 70…

Bron: vintagecomputer.net

Het web in 2013… en verder…

Het web in 2013… en verder…

Het web in 2013… en verder…

Niet meer alleen Google en Twitter…

ReactiveMerriam Webster: Readily responsive to a stimulus

De kwaliteiten van een reactieve applicatie

Reactive

Responsive

Resilient

Event-Driven

Scalable

Reactive

Responsive

Resilient

Event-Driven

Scalable

Normaal...

BCgetState()

state

AdoSomething()

E

D

De “Event Driven” manier

BC event

AdoSomething()

pub-subevent

Event Driven – Amdahl’s Law

The speedup of a program using multiple processors in parallel computing is limited by

the sequential fraction of the program.

Procedural – Not parallelizable...

public void doMyBusinessLogic() {

doSomethingInternally();

externalComponent1.doSomethingRelated();

externalComponent2.doSomethingElse();

return someResult;

}

Procedural – Parallelizable, but ugly...

public void doMyBusinessLogic() {

doSomethingInternally();

threadPool.execute(new Runnable() { ...

externalComponent1.doSomethingRelated()});

threadPool.execute(new Runnable() { ...

externalComponent2.doSomethingElse()});

return someResult;

}

Parallelizable...

public void doMyBusinessLogic() {

doSomethingInternally();

eventPublisher.publish(aNotification());

return someResult;

}

public void handler(Notification n) {

doSomethingRelated();

}

Separation of concerns

BC eventpub-sub

event

Business logicaBusiness

logica

Infrastructuur- Locking- Threading- Netwerk / IO

No dependencyGeen harde afhankelijkheden

De kwaliteiten van een reactieve applicatie

Reactive

Responsive

Resilient

Event-Driven

Scalable

ScalableMerriam Webster: “capable of being easily

expanded or upgraded on demand”

Elasticiteit

Location transparency

Doet zich voor als lokale aanroep...

SomeServiceInterface service = new RemoteService(...)

result = service.callSomeMethod();

Location transparency – embrace the network

service.someMethod(someParameter, new Callback() {

public void onResult(Result result) {// do stuff with result

}

public void onError(Exception e) {// handle failure

}

});

Events – Inherently location transparent

E

D

Beventpub-sub

eventC

De kwaliteiten van een reactieve applicatie

Reactive

Responsive

Resilient

Event-Driven

Scalable

ResilientMerriam Webster: • the ability of a substance or object to spring back into shape• the capacity to recover quickly from difficulties

Voorbeelden genoeg…

“Barclays Bank System Crashes” (2012)

“Lloyds' banking systems failure hits 22m retail customers” (2012)

“Failure of American Airlines reservations system grounds all flights” (2013)

Observeer componenten

E

D

Beventpub-sub

eventC

!

!

Stability patterns

Bulkhead

Circuit breaker

Timeouts

Decoupling middleware

Handshaking

Test Harness

Let it crash!

Stability patterns – Bulkhead

Stability patterns – Bulkhead

Bulkhead in software

BC event

AdoSomething()

pub-subevent

!

Bulkhead in software

BC event

AdoSomething()

pub-subevent

Bulkhead in software

BC event

AdoSomething()

pub-subevent

Circuitbreaker

Stability patterns – Circuitbreaker

BC

AdoSomething()

doSomething()

checkStatus()!

Stability patterns

Bulkhead

Circuit breaker

Timeouts

Decoupling middleware

Handshaking

Test Harness

Let it crash!

De kwaliteiten van een reactieve applicatie

Reactive

Responsive

Resilient

Event-Driven

Scalable

ResponsiveMerriam Webster: “quick to respond or

react appropriately"

Responsive is...

Responsive is...

Collaborative

Real-time

Engaging

Rich

Dus niet....

Dus wel...

Observable models...

Server

subscribe()

notify()

Stateful Client

Als we toch al events hebben...

Stateful Client Server

event pub-subevent

subscribe

Latency....

latency

# vo

orko

men

s

latency

# vo

orko

men

s

Capacity planning – Hoe groot moet een queue zijn?

Zo “kort” mogelijk?

Lekker “lang”?

Onbeperkt?

Reken het uit, of meet het!

Pnn ( )1 Wq

Ws

1

Capacity planning

Tijd

# re

ques

ts

De kwaliteiten van een reactieve applicatie

Reactive

Responsive

Resilient

Event-Driven

Scalable

En hoe?

Tools en hulpmiddelen voor Reactive Applications

Tools en Frameworks

Akka – Actor Model

Axon Framework – CQRS / EDA

Spring Reactor – Async message processing

WebSockets (JSR-356) – Full duplex communicatie over http(s)

Lambda Expressions – Voorkom “callback hell”Method references

Latency

Capacity planningQueues

Resilience

Stability patterns

Bulkhead pattern

Circuit breaker

WebSockets

Embrace the network

Location transparencyEvent Driven

Responsive

Back pressure

Asynchronous

Real-time

Engaging

Collaborative

Responsive

Amdahl

Little’s Law

Axon Framework

Event Driven Architecture

Actor model

Akka

Spring Reactor

Lambda’s

reactivemanifesto.org

Vragen?

Meer informatie: www.reactivemanifesto.org

www.axonframework.org

allard.buijze@trifork.nl