145
Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable Solutions [email protected] twitter: @jboner

Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka:Simpler Concurrency, Scalability &

Fault-tolerance through Actors

Jonas BonérScalable Solutions

[email protected] : @jboner

Page 2: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

The problem

It is way too hard to build:1. correct highly concurrent systems

2. truly scalable systems

3. fault-tolerant systems that self-heals

...using “state-of-the-art” tools

Page 3: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

VisionSimpler

Concurrency

Scalability

Fault-tolerance

Through one single unified

Programming model

Runtime service

Page 4: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Manage system overload

Page 5: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Scale up & Scale out

Page 6: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Replicate and distribute for fault-tolerance

Page 7: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Automatic & adaptive load balancing

Page 8: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Introducing

Scalability

PersistentDistributed Secure

Concurrency

Actors

Open Source

Fault-tolerance

STM Agents Dataflow

Clustered

Page 9: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

CoreModules

Architecture

Page 10: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Add-onModules

Architecture

Add-onModules

Page 11: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

EnterpriseModules

Architecture

Page 12: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Actorsone tool in the toolbox

Page 13: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Actors

Page 14: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

• Implements Message-Passing Concurrency• Share NOTHING• Isolated lightweight processes•Communicates through messages•Asynchronous and non-blocking• Each actor has a mailbox (message queue)

Actor Model of Concurrency

Page 15: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Actor Model of Concurrency

• Easier to reason about• Raised abstraction level• Easier to avoid–Race conditions–Deadlocks–Starvation–Live locks

Page 16: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Two different models

• Thread-based• Event-based– Very lightweight (600 bytes per actor)– Can easily create millions on a single workstation (13 million on 8 G RAM)– Does not consume a thread

Page 17: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

case  object  Tick

class  Counter  extends  Actor  {    private  var  counter  =  0

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

Actors

Page 18: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

import  Actor._

val  counter  =  actorOf[Counter]

Create Actors

counter is an ActorRef

Page 19: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  actor  =  actorOf(new  MyActor(..))

Create Actors

create actor with constructor arguments

Page 20: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  counter  =  actorOf[Counter]counter.start

Start actors

Page 21: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  counter  =  actorOf[Counter].start

Start actors

Page 22: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  counter  =  actorOf[Counter].startcounter.stop

Stop actors

Page 23: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  MyActor  extends  Actor  {

   override  def  preStart  =  {        ...  //  called  after  ‘start’      }

   override  def  postStop  =  {        ...  //  called  before  ‘stop’    }}

init & shutdown callbacks

Page 24: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  RecursiveActor  extends  Actor  {    private  var  counter  =  0    self.id  =  “service:recursive”

   def  receive  =  {        case  Tick  =>              counter  +=  1            self  !  Tick    }}

the self reference

Page 25: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  worker  =  actor  {    case  Work(fn)  =>  fn()}

Actorsanonymous

Page 26: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

counter  !  Tick  

Send: !

fire-forget

Page 27: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

counter.sendOneWay(Tick)

Send: !

fire-forget

Page 28: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  result  =  (actor  !!  Message).as[String]

Send: !!

uses Future under the hood (with time-out)

Page 29: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  result  =  counter.sendRequestReply(Tick)

Send: !!

uses Future under the hood (with time-out)

Page 30: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

//  returns  a  futureval  future  =  actor  !!!  Messagefuture.awaitval  result  =  future.get

...Futures.awaitOne(List(fut1,  fut2,  ...))Futures.awaitAll(List(fut1,  fut2,  ...))

Send: !!!

returns the Future directly

Page 31: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  result  =  counter.sendRequestReplyFuture(Tick)

Send: !!!

returns the Future directly

Page 32: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  SomeActor  extends  Actor  {    def  receive  =  {        case  User(name)  =>              //  use  reply            self.reply(“Hi  ”  +  name)    }}

Reply

Page 33: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  SomeActor  extends  Actor  {    def  receive  =  {        case  User(name)  =>              //  store  away  the  sender            //  to  use  later  or              //  somewhere  else            ...  =  self.sender    }}

Reply

Page 34: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  SomeActor  extends  Actor  {    def  receive  =  {        case  User(name)  =>              //  store  away  the  sender  future            //  to  resolve  later  or              //  somewhere  else            ...  =  self.senderFuture    }}

Reply

Page 35: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

//  define  the  case  classcase  class  Register(user:  User)

//  create  and  send  a  new  case  class  messageactor  !  Register(user)

//  tuplesactor  !  (username,  password)

//  listsactor  !  List(“bill”,  “bob”,  “alice”)

Immutable messages

Page 36: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  actors  =  ActorRegistry.actorsval  actors  =  ActorRegistry.actorsFor[TYPE]val  actors  =  ActorRegistry.actorsFor(id)val  actor  =  ActorRegistry.actorFor(uuid)ActorRegistry.foreach(fn)ActorRegistry.shutdownAll

ActorRegistry

Page 37: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TypedActor

Page 38: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  CounterImpl      extends  TypedActor  with  Counter  {

   private  var  counter  =  0;

   def  count  =  {        counter  +=  1        println(counter)    }}

Typed Actors

Page 39: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  counter  =  TypedActor.newInstance(        classOf[Counter],  classof[CounterImpl])

Create Typed Actor

Page 40: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

counter.count

Send message

fire-forget

Page 41: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  hits  =  counter.getNrOfHits

Request Reply

uses Future under the hood (with time-out)

Page 42: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  PingImpl  extends  TypedActor      with  Ping  {    def  hit(count:  Int)  =  {        val  pong  =  getContext

   .getSender.asInstanceOf[Pong]        pong.hit(count  +=  1)    }}

the context reference

Page 43: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

akka  {    version  =  "0.10"    time-­‐unit  =  "seconds"    actor  {        timeout  =  5        throughput  =  5    }}

Actors: config

Page 44: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Scalability BenchmarkSimple Trading system

• Synchronous Scala version• Scala Library Actors 2.8.0

•Fire-forget•Request-reply (Futures)

• Akka • Fire-forget (Hawt dispatcher)• Fire-forget (default dispatcher)• Request-reply

Run it yourself: http://github.com/patriknw/akka-sample-trading

Page 45: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Agentsyet another tool in the toolbox

Page 46: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  agent  =  Agent(5)

//  send  function  asynchronouslyagent  send  (_  +  1)  

val  result  =  agent()  //  deref...  //  use  result

agent.close

Agents

Cooperates with STM

Page 47: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Dispatchers

Page 48: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Dispatchers

• Executor-based Dispatcher• Executor-based Work-stealing Dispatcher• Hawt Dispatcher• Thread-based Dispatcher

Page 49: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

object  Dispatchers  {    object  globalHawtDispatcher  extends  HawtDispatcher    ...      def  newExecutorBasedEventDrivenDispatcher(name:  String)

   def  newExecutorBasedEventDrivenWorkStealingDispatcher(name:  String)

   def  newHawtDispatcher(aggregate:  Boolean)

   ...}

Dispatchers

Page 50: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  MyActor  extends  Actor  {    self.dispatcher  =  Dispatchers        .newThreadBasedDispatcher(self)        ...}

actor.dispatcher  =  dispatcher  //  before  started

Set dispatcher

Page 51: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Let it crash fault-tolerance

Page 52: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Influenced by

Erlang

Page 53: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

9 nines

Page 54: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 55: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 56: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 57: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 58: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 59: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 60: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 61: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

OneForOne fault handling strategy

Page 62: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AllForOnefault handling strategy

Page 63: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AllForOnefault handling strategy

Page 64: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AllForOnefault handling strategy

Page 65: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AllForOnefault handling strategy

Page 66: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AllForOnefault handling strategy

Page 67: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Supervisor hierarchies

Page 68: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Supervisor hierarchies

Page 69: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Supervisor hierarchies

Page 70: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Supervisor hierarchies

Page 71: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Supervisor hierarchies

Page 72: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Supervisor hierarchies

Page 73: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AllForOneStrategy(    maxNrOfRetries,      withinTimeRange)

OneForOneStrategy(    maxNrOfRetries,      withinTimeRange)

Fault handlers

Page 74: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

link(actor)  unlink(actor)  

startLink(actor)spawnLink[MyActor]

Linking

Page 75: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

trapExit  =  List(  classOf[ServiceException],    classOf[PersistenceException])

trapExit

Page 76: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  Supervisor  extends  Actor  {    trapExit  =  List(classOf[Throwable])    faultHandler  =          Some(OneForOneStrategy(5,  5000))

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

Supervision

Page 77: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

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

Manage failure

Page 78: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Remote Actors

Page 79: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

//  use  host  &  port  in  configRemoteNode.start

RemoteNode.start("localhost",  9999)

Remote Server

Scalable implementation based on NIO (Netty) & Protobuf

Page 80: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Two types of

remote actors

Client managed Server managed

Page 81: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

//  methods  in  Actor  class

spawnRemote[MyActor](host,  port)  

spawnLinkRemote[MyActor](host,  port)

startLinkRemote(actor,  host,  port)

Client-managedsupervision works across nodes

Page 82: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  actorProxy  =  spawnLinkRemote[MyActor](    “darkstar”,      9999)

actorProxy  !  message

Client-managedmoves actor to server

client manages through proxy

Page 83: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

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

Server-managedregister and manage actor on server

client gets “dumb” proxy handle

server part

Page 84: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  handle  =  RemoteClient.actorFor(    “service:id”,      “darkstar”,      9999)

handle  !  message

Server-managed

client part

Page 85: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Cluster.relayMessage(    classOf[TypeOfActor],  message)

for  (endpoint  <-­‐  Cluster)      spawnRemote[TypeOfActor](                                endpoint.host,                              endpoint.port)

Cluster Membership

Page 86: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

STMyet another tool in the toolbox

Page 87: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

71

What is STM?

Page 88: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

STM: overview• See the memory (heap and stack) as a transactional dataset

• Similar to a database• begin• commit• abort/rollback

• Transactions are retried automatically upon collision

• Rolls back the memory on abort

Page 89: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

• Separates Identity from Value- Values are immutable- Identity (Ref) holds Values

•Change is a function•Compare-and-swap (CAS)•Abstraction of time•Must be used within a transaction

Managed References

Page 90: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

import  se.scalablesolutions.akka.stm.local._  atomic  {    ...

   atomic  {        ...  //  transactions  compose!!!    }}

atomic

Page 91: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Typical OO: direct access to mutable objects

Managed ReferencesTypical OO - Direct

references to Mutable Objects

• Unifies identity and value

• Anything can change at any time

• Consistency is a user problem

• Encapsulation doesn’t solve concurrency problems

?

?

42

?

6:e

:d

:c

:b

:a

foo

Managed Reference: separates Identity & ValueClojure - Indirect references

to Immutable Objects

6

17

"ethel"

"fred"

42

:e

:d

:c

:b

:afoo

@foo

• Separates identity and value

• Obtaining value requires explicit dereference

• Values can never change

• Never an inconsistent value

• Encapsulation is orthogonal

Copyright Rich Hickey 2009

Page 92: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

• Separates Identity from Value- Values are immutable- Identity (Ref) holds Values

•Change is a function•Compare-and-swap (CAS)•Abstraction of time•Must be used within a transaction

Managed References

Page 93: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

import  se.scalablesolutions.akka.stm.local._  //  giving  an  initial  valueval  ref  =  Ref(0)  //  specifying  a  type  but  no  initial  valueval  ref  =  Ref[Int]

Managed References

Page 94: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  ref  =  Ref(0)  atomic  {    ref.set(5)}//  -­‐>  0  atomic  {    ref.get}//  -­‐>  5

Managed References

Page 95: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  ref  =  Ref(0)  atomic  {    ref  alter  (_  +  5)}//  -­‐>  5  val  inc  =  (i:  Int)  =>  i  +  1  atomic  {    ref  alter  inc}//  -­‐>  6

Managed References

Page 96: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  ref  =  Ref(1)  val  anotherRef  =  Ref(3)  atomic  {    for  {        value1  <-­‐  ref        value2  <-­‐  anotherRef    }  yield  (value1  +  value2)}//  -­‐>  Ref(4)  val  emptyRef  =  Ref[Int]  atomic  {    for  {        value1  <-­‐  ref        value2  <-­‐  emptyRef    }  yield  (value1  +  value2)}//  -­‐>  Ref[Int]

Managed References

Page 97: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

//  using  initial  valuesval  map        =  TransactionalMap("bill"  -­‐>  User("bill"))val  vector  =  TransactionalVector(Address("somewhere"))  //  specifying  typesval  map        =  TransactionalMap[String,  User]val  vector  =  TransactionalVector[Address]

Transactionaldatastructures

Page 98: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

atomic  {    deferred  {        //  executes  when  transaction  commits    }    compensating  {        //  executes  when  transaction  aborts    }}

life-cycle listeners

Page 99: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Actors + STM = Transactors

Page 100: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  UserRegistry  extends  Transactor  {        private  lazy  val  storage  =          TransactionalMap[String,  User]()

   def  receive  =  {        case  NewUser(user)  =>            storage  +  (user.name  -­‐>  user)        ...      }}

Transactors

Page 101: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 102: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Page 103: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Page 104: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Page 105: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Page 106: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Page 107: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Page 108: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Page 109: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Page 110: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Page 111: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Transaction fails

Page 112: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsStart transaction

Send message

Update statewithin transaction

Transaction fails

Page 113: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 114: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 115: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 116: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 117: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 118: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Transactors

Page 119: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

TransactorsTransactionautomatically

retried

Page 120: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  Transferer  extends  Actor  {    implicit  val  txFactory  =  TransactionFactory(        blockingAllowed  =  true,  trackReads  =  true,  timeout  =  60  seconds)      def  receive  =  {        case  Transfer(from,  to,  amount)  =>            atomic  {                if  (from.get  <  amount)  {                    log.info("not  enough  money  -­‐  retrying")                    retry                }                log.info("transferring")                from  alter  (_  -­‐  amount)                to  alter  (_  +  amount)            }    }}

blocking transactions

Page 121: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

   atomic  {        either  {            if  (left.get  <  amount)  {                log.info("not  enough  on  left  -­‐  retrying")                retry            }            log.info("going  left")        }  orElse  {            if  (right.get  <  amount)  {                log.info("not  enough  on  right  -­‐  retrying")                retry            }            log.info("going  right")        }    }

either-orElse

Page 122: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

akka  {    stm  {

           max-­‐retries  =  1000            timeout  =  10            write-­‐skew  =  true            blocking-­‐allowed  =  false            interruptible  =  false            speculative  =  true            quick-­‐release  =  true            propagation  =  requires            trace-­‐level  =  none            hooks  =  true            jta-­‐aware  =  off    }}

STM: config

Page 123: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Modules

Page 124: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Persistence

Page 125: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

STM gives usAtomicConsistentIsolated

Page 126: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

AtomicConsistentIsolatedDurable

Persistence module turns STM into

Page 127: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Persistence API

//  transactional  Cassandra-­‐backed  Map  val  map  =  CassandraStorage.newMap

//  transactional  Redis-­‐backed  Vector  val  vector  =  RedisStorage.newVector

//  transactional  Mongo-­‐backed  Refval  ref  =  MongoStorage.newRef

Page 128: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

For Redis only (so far)

val  queue:  PersistentQueue[ElementType]  =          RedisStorage.newQueue

val  set:  PersistentSortedSet[ElementType]  =    RedisStorage.newSortedSet

Page 129: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Spring

Page 130: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

<beans>    <akka:typed-­‐actor          id="myActiveObject"          interface="com.biz.MyPOJO"          implementation="com.biz.MyPOJO"          transactional="true"          timeout="1000"  />    ...</beans>

Spring integration

Page 131: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

<akka:supervision  id="my-­‐supervisor">

   <akka:restart-­‐strategy  failover="AllForOne"                                                    retries="3"                                                    timerange="1000">        <akka:trap-­‐exits>      <akka:trap-­‐exit>java.io.IOException</akka:trap-­‐exit>        </akka:trap-­‐exits>    </akka:restart-­‐strategy>

   <akka:typed-­‐actors>        <akka:typed-­‐actor  interface="com.biz.MyPOJO"                                              implementation="com.biz.MyPOJOImpl"                                              lifecycle="permanent"                                              timeout="1000">        </akka:typed-­‐actor>    </akka:typed-­‐actors></akka:supervision>

Spring integration

Page 132: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Camel

Page 133: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  MyConsumer  extends  Actor  with  Consumer  {    def  endpointUri  =  "file:data/input"      def  receive  =  {        case  msg:  Message  =>              log.info("received  %s"  format            msg.bodyAs(classOf[String]))    }}

Camel: consumer

Page 134: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  MyConsumer  extends  Actor  with  Consumer  {    def  endpointUri  =          "jetty:http://0.0.0.0:8877/camel/test"      def  receive  =  {        case  msg:  Message  =>              reply("Hello  %s"  format                          msg.bodyAs(classOf[String]))    }}

Camel: consumer

Page 135: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

class  CometProducer      extends  Actor  with  Producer  {        def  endpointUri  =          "cometd://localhost:8111/test"      def  receive  =  produce  //  use  default  impl}

Camel: producer

Page 136: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

val  producer  =  actorOf[CometProducer].start

val  time  =  "Current  time:  "  +  new  Dateproducer  !  time

Camel: producer

Page 137: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka HotSwap

Page 138: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

HotSwapactor  !  HotSwap({    //  new  body    case  Ping  =>          ...      case  Pong  =>          ...    })

Page 139: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

HotSwapself.become({    //  new  body    case  Ping  =>          ...      case  Pong  =>          ...    })

Page 140: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Deploy as dependency JAR in WEB-INF/lib etc. Run as stand-alone microkernel OSGi-enabled; drop in any

OSGi container (Spring DM server, Karaf etc.)

How to run it?

Page 141: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Akka Kernel

Page 142: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

java  -­‐jar  akka-­‐1.0-­‐SNAPSHOT.jar  \    -­‐Dakka.config=<path>/akka.conf

Start Kernel

Page 143: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

REST

Comet

Security

...and much much more

Web

GuiceOSGi

PubSub

FSM

Page 144: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

Learn morehttp://akkasource.org

Page 145: Scalable Solutionsgotocon.com/dl/jaoo-aarhus-2010/slides/JonasBonen_AkkaSimpler... · Akka: Simpler Concurrency, Scalability & Fault-tolerance through Actors Jonas Bonér Scalable

EOF