Beyond the buzzword: a reactive web-appliction in practice

Preview:

Citation preview

Beyond the buzzword:

a reac%ve web applica*on in prac*ce

Manuel Bernhardt - @elmanu

Enterprise Java User Group Linz - September 2016

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Agenda

1. Reac've applica'ons: why, what

2. Small Reac've Web Applica'on

3. Deployment & Load tes'ng

If you have a ques-on, shoot!

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Manuel Bernhardt

• I help mid-sized telecommunica4ons and technology companies ge7ng started with reac4ve microservice-based systems to speed up and scale IT delivery

• h=p://manuel.bernhardt.io

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Manuel Bernhardt

• I help mid-sized telecommunica4ons and technology companies ge7ng started with reac4ve microservice-based systems to speed up and scale IT delivery

• h=p://manuel.bernhardt.io

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Reac%ve applica%ons: why, what

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Root cause 1:evolu&on of so+ware architecture

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

"Good old days" architecture

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

"3 $er" architecture

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

"Cloud" architecture

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

"Microservices" architecture

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

=> Increasing amount of network I/O

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

=> Increasing amount of network I/O

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Root cause 2: evolu.on of hardware

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Why reac)ve ?

1. Distributed systems are the rule, not the excep1on

2. Programming needs to acknowledge the existance of many hardware threads, the lost opportunity of not using it & the cost of locking

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

What reac)ve ?

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Reac%ve systems are distributed systems

(they're a subset thereof)

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

What's the main difference between a distributed system and a non-

distributed system?

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

What's the main difference between a distributed system and a non-

distributed system?

Distributed systems fail much more o-en (and in much stranger ways)

than non-distributed onesEnterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

FailureFailure is a first-class ci.zen in reac.ve systems. They're designed for failure.

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Handling failure

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Handling failure• checked excep*ons are a terrible idea in the context of reac*ve /

distributed systems

• languages, tools and pa<erns for streamlining failure handling: Func*onal Programming, Futures, Message Passing

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Don't try to hide the network!• CORBA, RPC & friends: trying to abstract away the network

• what happens when the network call

• ... fails

• ... is slow

• ... is some%mes slow

• ... someAmes fails, someAmes doesn't

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Don't try to hide the network!

• ignoring of the Fallacies of Distributed Compu8ng (Deutsch & Gosling)

• ignoring the CAP theorem

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Reac%ve architectural pa/ern

h"p://www.reac,vemanifesto.org

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Reac%ve Systems - Conclusion

• Reac&ve Systems are designed for failure

• Reac&ve Systems are distributed, replicated accross several nodes (can scale up and down)

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Let's build a small Reac0ve Web Applica0on

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Actors

• lightweight objects

• send and receive messages (mailbox)

• can have children (supervision)

"Long-lived" async computa5on

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

CODING

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Futuresscala.concurrent.Future[T]

• holds a value of type T

• can either fail or succeed

• async code does not block a thread while wai8ng for comple8on

"Short-lived" async computa6on

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Pipeakka.pattern.pipe

• bridge between Futures and Actors

• implemented as anonymous actor

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Pipeakka.pattern.pipe

• bridge between Futures and Actors

• implemented as anonymous actor

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Circuit Breakerakka.pattern.CircuitBreaker

• helpful when dealing with legacy / slow systems & prevents cascading failure

• like an electric circuit breaker, trips when there's a surge

• trips a=er a given number of failures, for a given >meout, then a?empts reset

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

DeploymentEnterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Deployment• stand-alone vs. "elas/c deployment"

• elas/c, fault-tolerant is not trivial

• use a managed service / solu/on

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Deployment

• Lightbend ConductR

• automated cluster management for Play / Akka / ... applica>ons

• automated node failure & network par++on resolu+on

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Deployment

• fully managed opera0ons

• auto scalability feature (horizontal & ver0cal)

• a<rac0ve pricing

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Load tes)ngEnterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Gatling

• open-source load tes0ng framework

• built with Scala, Akka and Ne=y

• two phases: record and run

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Gatling simula,on file// ...setUp( scn.inject( nothingFor(4 seconds), rampUsers(100) over(10 seconds), atOnceUsers(10), constantUsersPerSec(2) during(15 seconds) randomized, splitUsers(500) into ( rampUsers(50) over(10 seconds) ) separatedBy(2 seconds) ).protocols(httpProtocol))

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Bees with machine guns

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Configuring all the things

• Installing Python & bees with machine guns

• AWS console (keys, security group w/ SSH access)

• boto config file

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Configuring all the things

~/.boto

[Credentials]aws_access_key_id = foobar1aws_secret_access_key = foobar2

[Boto]debug = 2

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

A"ack!

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu

Thank you!Ques%ons & Comments ?

• h#p://manuel.bernhardt.io

• manuel@bernhardt.io

• @elmanu

Enterprise JUG September 2016 Linz - manuel.bernhardt.io - @elmanu