Deep Introduction to Akka

Preview:

DESCRIPTION

Introduction to Akka actors with interesting example.

Citation preview

akkaIntroducing

Friday, September 30, 2011

DeepIntroduction to Akka

Patrik NordwallTypesafe

Twitter: @patriknw

Friday, September 30, 2011

Vision

Simpler

Concurrency

Scalability

Fault-tolerance

Friday, September 30, 2011

Actors

Friday, September 30, 2011

What is an Actor?

Friday, September 30, 2011

Event-drivenThread

Event-drivenThread

Behavior

State

Actor

Friday, September 30, 2011

case object Tick

class Counter extends Actor { var counter = 0

def receive = { case Tick => counter += 1 println(counter) }}

Actors

Friday, September 30, 2011

val counter = actorOf[Counter].start()

Create Actors

counter is an ActorRefFriday, September 30, 2011

counter ! Tick

Tell: !

fire-forget

Friday, September 30, 2011

// returns a futureval future = counter ? Current

val count: Option[Int] = future.as[Int]

Ask: ?

returns the Future directly

Friday, September 30, 2011

Replyclass Counter extends Actor { var counter = 0

def receive = { case Tick => counter += 1 case Current => self.reply(counter) }}

Friday, September 30, 2011

Future

future.awaitfuture onResult { ... } onException { ... } onTimeout { ... }

val future = Future { "Hello" + "World"}

Friday, September 30, 2011

object Shared { val myDispatcher = Dispatchers .newExecutorBasedEventDrivenDispatcher("my") .setCorePoolSize(7) .build}

class MyActor extends Actor { self.dispatcher = Shared.dispatcher ...}

Set dispatcher

Friday, September 30, 2011

Translation Service with HTTP API- count words: 100 ms- translate text: 100 ms

We have 8 threads

Must handle 4 concurrent request with average response time of <110 ms

Example

Friday, September 30, 2011

Example

Web Frontend

Translation Service

Text Translator

Word Counter

HTTP Req

Friday, September 30, 2011

Source code: https://github.com/patriknw/akka-playground

Example

Friday, September 30, 2011

Typed Actors

Friday, September 30, 2011

trait Counter { def tick(): Unit def current: Int}

Typed Actors

Friday, September 30, 2011

class CounterImpl extends TypedActor with Counter {

private var counter = 0

def tick() { counter += 1 }

def current = counter}

Typed Actors

Friday, September 30, 2011

val counter = TypedActor.newInstance( classOf[Counter], classOf[CounterImpl]) counter.tick()counter.tick()val cur = counter.current

Typed Actors

Friday, September 30, 2011

Remote Actors

Friday, September 30, 2011

// use host & port in configActor.remote.start()

Actor.remote.start("darkstar", 2552)

Remoting

Scalable implementation based on NIO (Netty) & Protobuf

Friday, September 30, 2011

import Actor._

remote.register(“service:id”, actorOf[MyService])

Server

server partFriday, September 30, 2011

val service = remote.actorFor( “service:id”, “darkstar”, 2552)

service ! message

Client

client part

Friday, September 30, 2011

Problem Deployment (local vs remote) is a dev decision

We get a fixed and hard-coded topology Can’t change it dynamically and adaptively

Needs to be a deployment & runtime decision

Remoting in Akka 1.2

Friday, September 30, 2011

Let it crash fault-tolerance

Friday, September 30, 2011

Fault-tolerant onion-layered Error Kernel

Friday, September 30, 2011

ErrorKernel

Friday, September 30, 2011

link(actor)unlink(actor)

startLink(actor)spawnLink[MyActor]

Linking

Friday, September 30, 2011

AllForOneStrategy( errors, maxNrOfRetries, withinTimeRange)

OneForOneStrategy( errors, maxNrOfRetries, withinTimeRange)

Fault handlers

Friday, September 30, 2011

class MySupervisor extends Actor { faultHandler = AllForOneStrategy( List(classOf[IllegalStateException]) 5, 5000))

def receive = { case Register(actor) => self.link(actor) }}

Supervision

Friday, September 30, 2011

class FaultTolerantService extends Actor { ... override def preRestart(reason: Throwable) = { ... // clean up before restart } override def postRestart(reason: Throwable) = { ... // init after restart }}

Manage failure

Friday, September 30, 2011

AMQP

Dataflow

Security

...and much much more

Async-HTTP

Guice

scalaz

FSMSTM

Spring

Camel

MicrokernelTestkit

Friday, September 30, 2011

Get it and learn morehttp://akka.io

Friday, September 30, 2011

EOFFriday, September 30, 2011