82
Above the Clouds Introducing Akka Peter Vlugter [email protected]

Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/[email protected] It’s hard to build systems that are highly concurrent middleware

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Above the CloudsIntroducing Akka

Peter [email protected]

Page 2: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

It’s hard tobuild systems

that are

highlyconcurrent

Page 3: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

middleware for building awesome concurrent and distributed applications

Akka

Page 4: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Simpler

Page 5: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Actorsobjects that send and receive messages

STMtransactions in shared memory

Dataflowdeterministic directed flow of data

Page 6: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 7: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Actor Model

A Universal Modular ACTOR Formalismfor Artificial Intelligence

Carl Hewitt, Peter Bishop, Richard Steiger

1973

Actor Model

A Universal Modular ACTOR Formalismfor Artificial Intelligence

Carl Hewitt, Peter Bishop, Richard Steiger

1973

Page 8: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Actor Model

A Universal Modular ACTOR Formalismfor Artificial Intelligence

Carl Hewitt, Peter Bishop, Richard Steiger

1973

Actor Model

Physics

Functional programmingfrom Lisp

Message passingfrom Simula and Smalltalk

Page 9: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

It’s actors all the way down

Until you reach turtles

Page 10: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

What is an actor?

Page 11: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

An actor is a computational entity

that responds to messages

Page 12: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

sendsend messages to other actors

createcreate new actors

becomedefine behaviour for the next message

Page 13: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 14: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Akka Actors

Page 15: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

actorOf[SomeActor](“name”)

returns an ActorRef, not an Actor

Actor reference

Page 16: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

actor ! message

asynchronous, fire and forget

Send

Page 17: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

actor tell message

non-symbolic method name

Send

Page 18: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

def receive = { case i: Int => ... case s: String => ... case _ => ...}

match with a partial function

Receive

Page 19: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class Counter extends Actor { var count = 0

def receive = { case Tick => count += 1 }}

Receive

Page 20: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

sender ! message

reference to the sender

Reply

Page 21: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class Counter extends Actor { var count = 0

def receive = { case Tick => count += 1 case Get => sender ! count }}

Reply

Page 22: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class Counter extends Actor { var count = 0

def receive = { case Tick => count += 1 case SendTo(actor) => actor ! count }}

pass actor references in messages

Actor-passing

Page 23: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

become { case Message => ...}

define the next receive behaviour

Hot swap

Page 24: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

unbecome()

revert to the previous behaviour

Hot swap

Page 25: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class Counter extends Actor { def receive = count(0)

def count(i: Int): Receive = { case Tick => become(count(i + 1)) case Get => sender ! i }}

recursive behaviour containing state

Behaviour and state

Page 26: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Example

Page 27: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Async work

HTTP request,received by a front end,

given to a worker,response to the client

Page 28: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class Worker extends Actor { def receive = { case Work(args) => val result = perform(args) sender ! result }}

worker simply replies with a result

Worker

Page 29: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class FrontEnd extends Actor { def receive = { case Request(params) => val worker: ActorRef = ... worker ! Work(params) // response? }}

how is the response handled?

Front end

Page 30: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

front end actor receives request

Async workfront end worker

request

Page 31: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

create an actor to handle this response

Async workfront end worker

request

responder

Page 32: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

send work with reply-to as responder

Async workfront end worker

responder

Page 33: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

result through responder

Async workfront end worker

responder

response

Page 34: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class Responder(request: Request) extends Actor { def receive = { case result => request completeWith result self.stop() }}

one-off actor for handling the result

Responder

Page 35: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

class FrontEnd extends Actor { def receive = { case Request(params) => val worker: ActorRef = ... implicit val replyTo = context.actorOf(new Responder(request)) worker ! Work(params) }}

create a responder to handle the result

Front end

Page 36: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 37: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Futures

Page 38: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

val future = actor ? message

ask an actor for something

Ask

Page 39: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

val future = actor ask message

non-symbolic method name

Ask

Page 40: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

future.get

blocks while waiting for the result

Future

Page 41: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

future onComplete { _.value.get match { case Left(problem) => ... case Right(result) => ... }}

add an on-complete callback

onComplete

Page 42: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

future onResult { ... }

future onException { ... }

future onTimeout { ... }

three types of completion

Callbacks

Page 43: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

val f1 = Future { “hello” }

val f2 = f1 map { _.length }

transform in the future

Mapping

Page 44: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

val f = for { a <- Future(40) b <- Future(2)} yield a + b

compose with for comprehensions

Composing

Page 45: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

val x, y, z = Promise[Int]()

flow { z << x() + y()}

flow { x << 40 }flow { y << 2 }

compose with dataflow

Dataflow

Page 46: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 47: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

STM

Page 48: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

def transfer(from: Ref[Int], to: Ref[Int], amount: Int) = atomic { from alter (_ - amount) to alter (_ + amount) }

classic bank account example

STM

Page 49: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

atomic { if (from.get < amount) retry from alter (_ - amount) to alter (_ + amount)}

explicitly retrying for conditions

STM retry

Page 50: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

atomic { // ... deferred { launcher ! FireMissiles }}

callback run when successful

Side-effects

Page 51: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 52: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Actor tree

b

a

d

c

ef

g

Page 53: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

path to actor c is /a/b/c

Actor path

b

a

d

c

ef

g

Page 54: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

system.actorFor(“/a/b/c”)

find an actor using its path

Find actors

Page 55: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Supervision

Page 56: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Erlang’s

9 nines

Page 57: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 58: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

the parent actor supervises the child

Supervisor

Page 59: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

resumeignore and continue as normal

restartcreate a fresh instance

stopterminate the actor permanently

escalatelet the supervisor above decide

Page 60: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

case _: ArithmeticException => Resumecase _: ActorInitException => Stopcase _: Exception => Restartcase _ => Escalate

Throwable => Action

Fault handler

Page 61: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

only the child that fails is affected

One for One

Page 62: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

one child fails, all children are affected

All for One

Page 63: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

entire sub-tree is affected

Escalate

Page 64: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

top-level guardians isolate and protect

Guardians

user system temp

Page 65: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 66: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Same code

Distributed

Page 67: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

akka.actor.deployment { /path/to/actor { remote { nodes = ["somewhere:2552"] } }}

configure an actor as remote

Remote actor

Page 68: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 69: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

akka.actor.deployment { /path/to/actor { router = "round-robin" nr-of-instances = 5 remote { nodes = ["wallace:2552", "gromit:2552", ...] } }}

several instances, round robin routing

Routers

Page 70: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 71: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Cluster

Decentralised peer-to-peer

Automatic failover and adaptive rebalancing

Page 72: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 73: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Gossip protocol

inspired by

Amazon’s Dynamo

Basho’s Riak

Page 74: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Add-ons

Page 75: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

IntegrationCamel, Spring, ZeroMQ, AMQP

HTTPPlay framework, REST APIs

Durable mailboxesFile system, Redis, MongoDB, Zookeeper

Page 76: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

MicrokernelStand-alone deployment

TestKitTesting toolkit for Akka actors

ConsoleTrace, monitor, manage, provision

Page 77: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware
Page 78: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Simpler to build systems that are

highly concurrent

truly scalable

fault tolerant

Page 79: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Learn more

http://akka.io

http://typesafe.com

Page 80: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

Thank you!

Page 81: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware

?

Page 82: Peter Vlugter - GOTO Conferencegotocon.com/dl/jaoo-melbourne-2011/slides/akka-yow-2.pdfpeter.vlugter@typesafe.com It’s hard to build systems that are highly concurrent middleware