2014-02-20 | Akka Concurrency (Vienna Scala User Group)

21

description

Book review of "Akka Concurrency" by Derek Wyatt Talk given at Vienna Scala User Group on Feb. 20, 2014

Transcript of 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Page 1: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)
Page 2: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)
Page 3: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber, @the_dom Vienna Scala User Group – Feb. 20, 2014

Page 4: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Akka Concurrency• 521 pages

• Written by Derek Wyatt, Foreword by Roland Kuhn

• Published in May 2013

• Based on Akka 2.1

• EUR 17,– (Kindle) / EUR 29,95 (Dead Tree)

Page 5: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Prerequisites• Basic Scala Knowledge

• No Akka Knowledge

• “Principles of Reactive Programming” Course: Half of the content will be new

Page 6: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Pros

• Big focus on testing

• One big, concise example throughout the book

• Exhaustive overview

Page 7: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Cons

• Based on Akka 2.1

• No Akka Cluster

• No Akka Persistence

Page 8: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Table of Contents, I• Why Akka?, Concurrency and Parallelism, Actors,…

• Akka Testing

• Supervision and DeathWatch

• Being Stateful

• Routing Messages

• Dispatchers and Mailboxes

Page 9: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Table of Contents, II• Futures, Networking, Remote Actors

• Sharing Data with Agents

• Granular Concurrency with Dataflow

• Patterns / Antipatterns

• Add-On Modules

• Using Akka from Java

Page 10: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Some Examples

Page 11: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Being Statefuldef expectHello: Receive = {

case “Hello” =>

sender ! “Goodbye”

context.become(expectGoodbye)

}

def expectGoodbye: Receive = {

case “Goodbye” =>

sender ! “Hello”

context.become(expectHello)

}

def receive = expectHello

Page 12: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

FSMsealed trait State

case object Idle extends State

case object Active extends State

!

sealed trait Data

case object Uninitialized extends Data

case class Todo(target: ActorRef, queue: immutable.Seq[Any]) extends Data

Page 13: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

class Buncher extends Actor with FSM[State, Data] {

startWith(Idle, Uninitialized)

when(Idle) {

case Event(SetTarget(ref), Uninitialized) =>

stay using Todo(ref, Vector.empty)

}

when(Active, stateTimeout = 1 second) {

case Event(Flush | StateTimeout, t: Todo) =>

goto(Idle) using t.copy(queue = Vector.empty)

}

// …

}

Page 14: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

class Buncher extends Actor with FSM[State, Data] {

//…

onTransition {

case Active -> Idle =>

stateData match {

case Todo(ref, queue) => ref ! Batch(queue)

}

}

whenUnhandled {

// common code for both states

case Event(Queue(obj), t @ Todo(_, v)) =>

goto(Active) using t.copy(queue = v :+ obj)

case Event(e, s) =>

log.warning("received unhandled request {} in state {}/{}", e, stateName, s)

stay

}

}

Page 15: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Routers• RoundRobinRouter

• RandomRouter

• BroadcastRouter

• SmallestMailboxRouter

• ScatterGatherFirstCompletedRouter

Page 16: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Dataflow Concurrencydef calculatePiTo(places: Int): Future[BigDecimal] = ???

def fibonaccis(n: Int): Future[Seq[BigDecimal]] = ???

val perfect = flow {

val pie = calculatePiTo(3000000)

val fibs = fibonaccis(31402)

val lastFibs = fibs().last

pie() * lastFibs * lastFibs

}

Page 17: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Page 18: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Future

val result = for {

i <- Future(5)

j <- Future(11)

} yield j

Blocking!

Page 19: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Future

Translates to:

val result = fiveFuture.flatMap { i =>

Future(11) map { j => j }

}

Page 20: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Futureval fiveFuture = Future(5)

val elevenFuture = Future(11)

val result = for {

i <- fiveFuture

j <- elevenFuture

} yield j

Non-Blocking

Page 21: 2014-02-20 | Akka Concurrency (Vienna Scala User Group)

Dominik Gruber • @the_domAkka Concurrency

Future

Translates to:

val result = fiveFuture.flatMap { i =>

elevenFuture map { j => j }

}