Upload
patriknw
View
2.683
Download
2
Embed Size (px)
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