Introducing

         Jonas Bonér
          CTO Typesafe
Introducing
Introducing

                Akka (Áhkká)
  The name comes from the goddess in the Sami
  (native swedes) mythology that represented all
        the wisdom and beauty in the world.

   It is also the name of a beautiful mountain in
         Laponia in the north part of Sweden
Introducing
Vision

Simpler
     Concurrency
     Scalability
     Fault-tolerance
Vision

...with a single unified
     Programming Model
     Managed Runtime
     Open Source Distribution
Manage System Overload
Scale UP & Scale OUT
Program at a Higher Level
Program at a Higher Level
Program at a Higher Level
• Never think in terms of shared state, state
   visibility, threads, locks, concurrent collections,
   thread notifications etc.
Program at a Higher Level
• Never think in terms of shared state, state
   visibility, threads, locks, concurrent collections,
   thread notifications etc.
• Low level concurrency plumbing BECOMES
   SIMPLE WORKFLOW - you only think about how
   messages flow in the system
Program at a Higher Level
• Never think in terms of shared state, state
   visibility, threads, locks, concurrent collections,
   thread notifications etc.
• Low level concurrency plumbing BECOMES
   SIMPLE WORKFLOW - you only think about how
   messages flow in the system
• You get high CPU utilization, low latency, high
   throughput and scalability - FOR FREE as part of
   the model
Program at a Higher Level
• Never think in terms of shared state, state
   visibility, threads, locks, concurrent collections,
   thread notifications etc.
• Low level concurrency plumbing BECOMES
   SIMPLE WORKFLOW - you only think about how
   messages flow in the system
• You get high CPU utilization, low latency, high
   throughput and scalability - FOR FREE as part of
   the model
• Proven and superior model for detecting and
   recovering from errors
Distributable by Design
Distributable by Design
Distributable by Design
• Actors are location transparent & distributable by design
Distributable by Design
• Actors are location transparent & distributable by design
• Scale UP and OUT for free as part of the model
Distributable by Design
• Actors are location transparent & distributable by design
• Scale UP and OUT for free as part of the model
• You get the PERFECT FABRIC for the CLOUD
Distributable by Design
• Actors are location transparent & distributable by design
• Scale UP and OUT for free as part of the model
• You get the PERFECT FABRIC for the CLOUD
 -   elastic & dynamic
Distributable by Design
• Actors are location transparent & distributable by design
• Scale UP and OUT for free as part of the model
• You get the PERFECT FABRIC for the CLOUD
 -   elastic & dynamic

 -   fault-tolerant & self-healing
Distributable by Design
• Actors are location transparent & distributable by design
• Scale UP and OUT for free as part of the model
• You get the PERFECT FABRIC for the CLOUD
 -   elastic & dynamic

 -   fault-tolerant & self-healing

 -   adaptive load-balancing, cluster rebalancing & actor migration
Distributable by Design
• Actors are location transparent & distributable by design
• Scale UP and OUT for free as part of the model
• You get the PERFECT FABRIC for the CLOUD
 -   elastic & dynamic

 -   fault-tolerant & self-healing

 -   adaptive load-balancing, cluster rebalancing & actor migration

 -   build extremely loosely coupled and dynamic systems that can
     change and adapt at runtime
Selection of Akka Production Users
How
can we achieve this?
How
can we achieve this?
Let’s use Actors




     How
can we achieve this?
What is an Actor?
What is an Actor?
What is an Actor?
• Akka's unit of code organization is called an Actor
What is an Actor?
• Akka's unit of code organization is called an Actor
• Actors helps you create concurrent, scalable and
   fault-tolerant applications
What is an Actor?
• Akka's unit of code organization is called an Actor
• Actors helps you create concurrent, scalable and
   fault-tolerant applications

• Like Java EE servlets and session beans, Actors is a
   model for organizing your code that keeps many
   “policy decisions” separate from the business logic
What is an Actor?
• Akka's unit of code organization is called an Actor
• Actors helps you create concurrent, scalable and
   fault-tolerant applications

• Like Java EE servlets and session beans, Actors is a
   model for organizing your code that keeps many
   “policy decisions” separate from the business logic

• Actors may be new to many in the Java community,
   but they are a tried-and-true concept (Hewitt 1973)
   used for many years in telecom systems with 9 nines
   uptime
Actors can be seen as
Virtual Machines (nodes)
  in Cloud Computing
Encapsulated
and decoupled
 black boxes...
Encapsulated
and decoupled
 black boxes...
...that manages their own
   memory and behavior
...that manages their own
   memory and behavior
Communicates
with asynchronous
   non-blocking
     messages
Communicates
with asynchronous
   non-blocking
     messages
Elastic - grow and
shrink on demand
Elastic - grow and
shrink on demand
Elastic - grow and
shrink on demand
Elastic - grow and
shrink on demand
Hot deploy - change
behavior at runtime
Hot deploy - change
behavior at runtime
Now - if we replace

             with
                    Actor
EVERYTHING will STILL HOLD for both
  LOCAL and DISTRIBUTED Actors
What can I use Actors for?
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component

  -   a callback or listener
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component

  -   a callback or listener

  -   a singleton or service
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component

  -   a callback or listener

  -   a singleton or service

  -   a router, load-balancer or pool
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component

  -   a callback or listener

  -   a singleton or service

  -   a router, load-balancer or pool

  -   a Java EE Session Bean or Message-Driven Bean
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component

  -   a callback or listener

  -   a singleton or service

  -   a router, load-balancer or pool

  -   a Java EE Session Bean or Message-Driven Bean

  -   an out-of-process service
What can I use Actors for?
 In different scenarios, an Actor may be an
 alternative to:
  -   a thread

  -   an object instance or component

  -   a callback or listener

  -   a singleton or service

  -   a router, load-balancer or pool

  -   a Java EE Session Bean or Message-Driven Bean

  -   an out-of-process service

  -   a Finite State Machine (FSM)
So, what is the
Actor Model?
Carl Hewitt’s definition




    http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:




                http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing




                     http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing

    -   Storage




                     http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing

    -   Storage

    -   Communication




                     http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing

    -   Storage

    -   Communication

-   3 axioms - When an Actor receives a message it can:




                     http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing

    -   Storage

    -   Communication

-   3 axioms - When an Actor receives a message it can:
    -   Create new Actors




                     http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing

    -   Storage

    -   Communication

-   3 axioms - When an Actor receives a message it can:
    -   Create new Actors

    -   Send messages to Actors it knows



                     http://bit.ly/hewitt-on-actors
Carl Hewitt’s definition
-   The fundamental unit of computation that embodies:
    -   Processing

    -   Storage

    -   Communication

-   3 axioms - When an Actor receives a message it can:
    -   Create new Actors

    -   Send messages to Actors it knows

    -   Designate how it should handle the next message it receives

                     http://bit.ly/hewitt-on-actors
4 core Actor operations
       0. DEFINE
       1. CREATE
       2. SEND
       3. BECOME
       4. SUPERVISE
0. DEFINE
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}
0. DEFINE
                        Define the message(s) the Actor
                         should be able to respond to


public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}
0. DEFINE
                        Define the message(s) the Actor
                         should be able to respond to


public class Greeting implements Serializable {
   public final String who;
                        Define the Actor class
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}
0. DEFINE
                        Define the message(s) the Actor
                         should be able to respond to


public class Greeting implements Serializable {
   public final String who;
                        Define the Actor class
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
                            Define the Actor’s behavior
}
Scala version
case class Greeting(who: String)

class GreetingActor extends Actor with ActorLogging {
  def receive = {
    case Greeting(who) => log.info("Hello {}", who)
  }
}
1. CREATE
• CREATE - creates a new instance of an Actor
• Extremely lightweight (2.7 Million per Gb RAM)
• Very strong encapsulation - encapsulates:
  -    state

  -    behavior

  -    message queue

• State & behavior is indistinguishable from each other
• Only way to observe state is by sending an actor a
  message and see how it reacts
CREATE Actor
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
CREATE Actor
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }             Create an Actor system
    }
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
CREATE Actor
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }             Create an Actor system
    }                                             Actor configuration
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
CREATE Actor
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }             Create an Actor system
    }                                             Actor configuration
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");



                                                          Give it a name
CREATE Actor
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }             Create an Actor system
    }                                              Actor configuration
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");


                                       Create the Actor
                                                           Give it a name
CREATE Actor
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }             Create an Actor system
    }                                              Actor configuration
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");


                                       Create the Actor
           You get an ActorRef back                        Give it a name
Actors can form hierarchies
          Guardian System Actor
Actors can form hierarchies
          Guardian System Actor




          system.actorOf(Props[Foo], “Foo”)
Actors can form hierarchies
             Guardian System Actor




       Foo   system.actorOf(Props[Foo], “Foo”)
Actors can form hierarchies
               Guardian System Actor




       Foo




             context.actorOf(Props[A], “A”)
Actors can form hierarchies
               Guardian System Actor




       Foo




      A      context.actorOf(Props[A], “A”)
Actors can form hierarchies
             Guardian System Actor




       Foo                           Bar




                                           A
      A          C




             E                                 C
B
                                     B

      D
Name resolution - like a file-system
                Guardian System Actor




          Foo                           Bar




                                              A
          A         C




                E                                 C
    B
                                        B

          D
Name resolution - like a file-system
                     Guardian System Actor



        /Foo

               Foo                           Bar




                                                   A
               A         C




                     E                                 C
    B
                                             B

               D
Name resolution - like a file-system
                         Guardian System Actor



            /Foo

                   Foo                           Bar



        /Foo/A
                                                       A
                   A         C




                         E                                 C
    B
                                                 B

                   D
Name resolution - like a file-system
                             Guardian System Actor



                /Foo

                       Foo                           Bar



            /Foo/A
                                                           A
                       A         C


 /Foo/A/B

                             E                                 C
       B
                                                     B

                       D
Name resolution - like a file-system
                                Guardian System Actor



                   /Foo

                          Foo                           Bar



              /Foo/A
                                                              A
                          A         C


 /Foo/A/B

                                E                                 C
       B
                                                        B

                          D
            /Foo/A/D
2. SEND
2. SEND
• SEND - sends a message to an Actor
2. SEND
• SEND - sends a message to an Actor
• Asynchronous and Non-blocking - Fire-forget
2. SEND
• SEND - sends a message to an Actor
• Asynchronous and Non-blocking - Fire-forget
• Everything happens Reactively
2. SEND
• SEND - sends a message to an Actor
• Asynchronous and Non-blocking - Fire-forget
• Everything happens Reactively
 -   An Actor is passive until a message is sent to it,
     which triggers something within the Actor
2. SEND
• SEND - sends a message to an Actor
• Asynchronous and Non-blocking - Fire-forget
• Everything happens Reactively
 -   An Actor is passive until a message is sent to it,
     which triggers something within the Actor

 -   Messages is the Kinetic Energy in an Actor system
2. SEND
• SEND - sends a message to an Actor
• Asynchronous and Non-blocking - Fire-forget
• Everything happens Reactively
 -   An Actor is passive until a message is sent to it,
     which triggers something within the Actor

 -   Messages is the Kinetic Energy in an Actor system

 -   Actors can have lots of buffered Potential Energy
     but can't do anything with it until it is triggered by
     a message
2. SEND
• SEND - sends a message to an Actor
• Asynchronous and Non-blocking - Fire-forget
• Everything happens Reactively
 -   An Actor is passive until a message is sent to it,
     which triggers something within the Actor

 -   Messages is the Kinetic Energy in an Actor system

 -   Actors can have lots of buffered Potential Energy
     but can't do anything with it until it is triggered by
     a message

• EVERYTHING is asynchronous and lockless
Throughput on a single box




  +50 million messages per second
SEND message
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell(new Greeting("Charlie Parker"));
SEND message
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell(new Greeting("Charlie Parker"));


                    Send the message
Full example
public class Greeting implements Serializable {
   public final String who;
   public Greeting(String who) { this.who = who; }
}

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        public void onReceive(Object message) throws Exception {
          if (message instanceof Greeting)
             log.info("Hello {}", ((Greeting) message).who);
          }
    }
}

ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell(new Greeting("Charlie Parker"));
Scala version
case class Greeting(who: String)

class GreetingActor extends Actor with ActorLogging {
  def receive = {
    case Greeting(who) => log.info("Hello {}", who)
  }
}

val system = ActorSystem("MySystem")
val greeter = system.actorOf(Props[GreetingActor], name = "greeter")
greeter tell Greeting("Charlie Parker")
Reply
class SomeActor extends UntypedActor {
  void onReceive(Object msg) {
    if (msg instanceof User) {
      User user = (User) msg;
      // reply to sender
      getSender().tell(“Hi ” + user.name);
    }
  }
}
Scala version
class SomeActor extends Actor {
  def receive = {
    case User(name) =>
      // reply to sender
      sender tell (“Hi ” + name)
  }
}
Remote deployment
Just feed the ActorSystem with this configuration


   akka {
     actor {
       provider =    akka.remote.RemoteActorRefProvider
       deployment    {
         /Greeter    {
            remote   =
          }
       }
     }
   }
Remote deployment
Just feed the ActorSystem with this configuration

                                       Configure a Remote Provider
   akka {
     actor {
       provider =    akka.remote.RemoteActorRefProvider
       deployment    {
         /Greeter    {
            remote   =
          }
       }
     }
   }
Remote deployment
     Just feed the ActorSystem with this configuration

                                                  Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider =    akka.remote.RemoteActorRefProvider
                  deployment    {
                     /Greeter   {
                       remote   =
                     }
                  }
              }
           }
Remote deployment
     Just feed the ActorSystem with this configuration

                                                  Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider =    akka.remote.RemoteActorRefProvider
                  deployment    {
                     /Greeter   {
                       remote   =
                     }
                  }
    Define Remote Path
              }
           }
Remote deployment
    Just feed the ActorSystem with this configuration

                                             Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider = akka.remote.RemoteActorRefProvider
                  deployment {
                     /Greeter {
                       remote = akka://
                     }
                  }
    Define Remote Path
              }           Protocol
           }
Remote deployment
    Just feed the ActorSystem with this configuration

                                             Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider = akka.remote.RemoteActorRefProvider
                  deployment {
                     /Greeter {
                       remote = akka://MySystem
                     }
                  }
    Define Remote Path
              }           Protocol  Actor System
           }
Remote deployment
    Just feed the ActorSystem with this configuration

                                             Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider = akka.remote.RemoteActorRefProvider
                  deployment {
                     /Greeter {
                       remote = akka://MySystem@machine1
                     }
                  }
    Define Remote Path
              }           Protocol  Actor System Hostname
           }
Remote deployment
     Just feed the ActorSystem with this configuration

                                              Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider = akka.remote.RemoteActorRefProvider
                  deployment {
                     /Greeter {
                       remote = akka://MySystem@machine1:2552
                     }
                  }
    Define Remote Path
              }           Protocol  Actor System Hostname   Port
           }
Remote deployment
     Just feed the ActorSystem with this configuration

                                              Configure a Remote Provider
           akka {
For the Greeter actor {
              actor
                  provider = akka.remote.RemoteActorRefProvider
                  deployment {
                     /Greeter {
                       remote = akka://MySystem@machine1:2552
                     }
                  }
    Define Remote Path
              }           Protocol  Actor System Hostname   Port
           }



                       Zero code changes
3. BECOME
3. BECOME
• BECOME - dynamically redefines Actor’s behavior
3. BECOME
• BECOME - dynamically redefines Actor’s behavior
• Triggered reactively by receive of message
3. BECOME
• BECOME - dynamically redefines Actor’s behavior
• Triggered reactively by receive of message
• In a type system analogy it is as if the object changed
  type - changed interface, protocol & implementation
3. BECOME
• BECOME - dynamically redefines Actor’s behavior
• Triggered reactively by receive of message
• In a type system analogy it is as if the object changed
  type - changed interface, protocol & implementation
• Will now react differently to the messages it receives
3. BECOME
• BECOME - dynamically redefines Actor’s behavior
• Triggered reactively by receive of message
• In a type system analogy it is as if the object changed
  type - changed interface, protocol & implementation
• Will now react differently to the messages it receives
• Behaviors are stacked & can be pushed and popped
Why would I want to do that?
Why would I want to do that?
• Let a highly contended Actor adaptively transform
  himself into an Actor Pool or a Router
Why would I want to do that?
• Let a highly contended Actor adaptively transform
  himself into an Actor Pool or a Router
• Implement an FSM (Finite State Machine)
Why would I want to do that?
• Let a highly contended Actor adaptively transform
  himself into an Actor Pool or a Router
• Implement an FSM (Finite State Machine)
• Implement graceful degradation
Why would I want to do that?
• Let a highly contended Actor adaptively transform
  himself into an Actor Pool or a Router
• Implement an FSM (Finite State Machine)
• Implement graceful degradation
• Spawn up (empty) generic Worker processes that
  can become whatever the Master currently needs
Why would I want to do that?
• Let a highly contended Actor adaptively transform
  himself into an Actor Pool or a Router
• Implement an FSM (Finite State Machine)
• Implement graceful degradation
• Spawn up (empty) generic Worker processes that
  can become whatever the Master currently needs
• etc. use your imagination
Why would I want to do that?
• Let a highly contended Actor adaptively transform
  himself into an Actor Pool or a Router
• Implement an FSM (Finite State Machine)
• Implement graceful degradation
• Spawn up (empty) generic Worker processes that
  can become whatever the Master currently needs
• etc. use your imagination
• Very useful once you get the used to it
become
context.become(new Procedure[Object]() {
  void apply(Object msg) {
    // new body
    if (msg instanceof NewMessage) {
      NewMessage newMsg = (NewMessage)msg;
      ...
    }
  }
});
Actor context available
                          become
 from within an Actor



         context.become(new Procedure[Object]() {
           void apply(Object msg) {
             // new body
             if (msg instanceof NewMessage) {
               NewMessage newMsg = (NewMessage)msg;
               ...
             }
           }
         });
Scala version
  context become {
    // new body
    case NewMessage =>
      ...
  }
Load Balancing
Routers
val router =
 system.actorOf(
   Props[SomeActor].withRouter(
    RoundRobinRouter(nrOfInstances = 5)))




               Scala API
Router + Resizer
val resizer =
  DefaultResizer(lowerBound = 2, upperBound = 15)

val router =
  system.actorOf(
    Props[ExampleActor1].withRouter(
      RoundRobinRouter(resizer = Some(resizer))))




                   Scala API
Failure management in Java/C/C# etc.
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
   • So you need to do all explicit error handling
     WITHIN this single thread
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
   • So you need to do all explicit error handling
     WITHIN this single thread
   • To make things worse - errors do not propagate
     between threads so there is NO WAY OF EVEN
     FINDING OUT that something have failed
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
   • So you need to do all explicit error handling
     WITHIN this single thread
   • To make things worse - errors do not propagate
     between threads so there is NO WAY OF EVEN
     FINDING OUT that something have failed
   • This leads to DEFENSIVE programming with:
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
   • So you need to do all explicit error handling
     WITHIN this single thread
   • To make things worse - errors do not propagate
     between threads so there is NO WAY OF EVEN
     FINDING OUT that something have failed
   • This leads to DEFENSIVE programming with:
      • Error handling TANGLED with business logic
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
   • So you need to do all explicit error handling
     WITHIN this single thread
   • To make things worse - errors do not propagate
     between threads so there is NO WAY OF EVEN
     FINDING OUT that something have failed
   • This leads to DEFENSIVE programming with:
      • Error handling TANGLED with business logic
      • SCATTERED all over the code base
Failure management in Java/C/C# etc.
   • You are given a SINGLE thread of control
   • If this thread blows up you are screwed
   • So you need to do all explicit error handling
     WITHIN this single thread
   • To make things worse - errors do not propagate
     between threads so there is NO WAY OF EVEN
     FINDING OUT that something have failed
   • This leads to DEFENSIVE programming with:
      • Error handling TANGLED with business logic
      • SCATTERED all over the code base

      We can do better than this!!!
4. SUPERVISE
4. SUPERVISE
• SUPERVISE - manage another Actor’s failures
4. SUPERVISE
• SUPERVISE - manage another Actor’s failures
• Error handling in actors is handle by letting Actors
  monitor (supervise) each other for failure
4. SUPERVISE
• SUPERVISE - manage another Actor’s failures
• Error handling in actors is handle by letting Actors
  monitor (supervise) each other for failure
• This means that if an Actor crashes, a notification
  will be sent to his supervisor, who can react upon
  the failure
4. SUPERVISE
• SUPERVISE - manage another Actor’s failures
• Error handling in actors is handle by letting Actors
  monitor (supervise) each other for failure
• This means that if an Actor crashes, a notification
  will be sent to his supervisor, who can react upon
  the failure
• This provides clean separation of processing and
  error handling
...let’s take a
standard OO
  application
Which components have
critically important state
            and
 explicit error handling?
Fault-tolerant
 onion-layered
 Error Kernel
Error
Kernel
Error
Kernel
Error
Kernel
Error
Kernel
Error
Kernel
Error
Kernel
Node 1   Node 2
Error
Kernel
SUPERVISE Actor
   Every single actor has a
 default supervisor strategy.
 Which is usually sufficient.
  But it can be overridden.
SUPERVISE Actor
                  Every single actor has a
                default supervisor strategy.
                Which is usually sufficient.
                 But it can be overridden.
class Supervisor extends UntypedActor {
  private SupervisorStrategy strategy = new OneForOneStrategy(
    10,
    Duration.parse("1 minute"),
    new Function<Throwable, Directive>() {
      @Override public Directive apply(Throwable t) {
        if (t instanceof ArithmeticException)       return resume();
        else if (t instanceof NullPointerException) return restart();
        else                                        return escalate();
    }
  });

  @Override public SupervisorStrategy supervisorStrategy() {
SUPERVISE Actor
class Supervisor extends UntypedActor {
  private SupervisorStrategy strategy = new OneForOneStrategy(
    10,
    Duration.parse("1 minute"),
    new Function<Throwable, Directive>() {
      @Override public Directive apply(Throwable t) {
        if (t instanceof ArithmeticException)       return resume();
        else if (t instanceof NullPointerException) return restart();
        else                                        return escalate();
    }
  });

    @Override public SupervisorStrategy supervisorStrategy() {
      return strategy;
    }

    ActorRef worker = context.actorOf(new Props(Worker.class));

    public void onReceive(Object message) throws Exception {
      if (message instanceof Integer) worker.forward(message);
    }
}
Scala version
class Supervisor extends Actor {
  override val supervisorStrategy =
                     (maxNrOfRetries = 10, withinTimeRange = 1 minute) {
      case _: ArithmeticException => Resume
      case _: NullPointerException => Restart
      case _: Exception             => Escalate
  }

    val worker = context.actorOf(Props[Worker])

    def receive = {
      case n: Int => worker forward n
    }
}
Scala version
class Supervisor extends Actor {
  override val supervisorStrategy =
    OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
      case _: ArithmeticException => Resume
      case _: NullPointerException => Restart
      case _: Exception             => Escalate
  }

    val worker = context.actorOf(Props[Worker])

    def receive = {
      case n: Int => worker forward n
    }
}
Scala version
class Supervisor extends Actor {
  override val supervisorStrategy =
    AllForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
      case _: ArithmeticException => Resume
      case _: NullPointerException => Restart
      case _: Exception             => Escalate
  }

    val worker = context.actorOf(Props[Worker])

    def receive = {
      case n: Int => worker forward n
    }
}
Manage failure
class Worker extends Actor {
  ...

    override def preRestart(
      reason: Throwable, message: Option[Any]) {
      ... // clean up before restart
    }

    override def postRestart(reason: Throwable) {
      ... // init after restart
    }
}


                   Scala API
This was
Akka 2.x
This was
  Akka 2.x
Well...it’s a start...
...we have much much more
...we have much much more
TestKit           Cluster                      FSM
                                    IO
    HTTP/REST
                         EventBus
 Durable Mailboxes                          Pub/Sub
                            Camel
Microkernel
              TypedActor       SLF4J          AMQP
  ZeroMQ
                     Dataflow             Transactors
Agents
                Spring              Extensions
get it and learn more
       http://akka.io
    http://letitcrash.com
    http://typesafe.com
EOF

Introducing Akka

  • 1.
    Introducing Jonas Bonér CTO Typesafe
  • 2.
  • 3.
    Introducing Akka (Áhkká) The name comes from the goddess in the Sami (native swedes) mythology that represented all the wisdom and beauty in the world. It is also the name of a beautiful mountain in Laponia in the north part of Sweden
  • 4.
  • 5.
    Vision Simpler Concurrency Scalability Fault-tolerance
  • 6.
    Vision ...with a singleunified Programming Model Managed Runtime Open Source Distribution
  • 7.
  • 8.
    Scale UP &Scale OUT
  • 9.
    Program at aHigher Level
  • 10.
    Program at aHigher Level
  • 11.
    Program at aHigher Level • Never think in terms of shared state, state visibility, threads, locks, concurrent collections, thread notifications etc.
  • 12.
    Program at aHigher Level • Never think in terms of shared state, state visibility, threads, locks, concurrent collections, thread notifications etc. • Low level concurrency plumbing BECOMES SIMPLE WORKFLOW - you only think about how messages flow in the system
  • 13.
    Program at aHigher Level • Never think in terms of shared state, state visibility, threads, locks, concurrent collections, thread notifications etc. • Low level concurrency plumbing BECOMES SIMPLE WORKFLOW - you only think about how messages flow in the system • You get high CPU utilization, low latency, high throughput and scalability - FOR FREE as part of the model
  • 14.
    Program at aHigher Level • Never think in terms of shared state, state visibility, threads, locks, concurrent collections, thread notifications etc. • Low level concurrency plumbing BECOMES SIMPLE WORKFLOW - you only think about how messages flow in the system • You get high CPU utilization, low latency, high throughput and scalability - FOR FREE as part of the model • Proven and superior model for detecting and recovering from errors
  • 15.
  • 16.
  • 17.
    Distributable by Design •Actors are location transparent & distributable by design
  • 18.
    Distributable by Design •Actors are location transparent & distributable by design • Scale UP and OUT for free as part of the model
  • 19.
    Distributable by Design •Actors are location transparent & distributable by design • Scale UP and OUT for free as part of the model • You get the PERFECT FABRIC for the CLOUD
  • 20.
    Distributable by Design •Actors are location transparent & distributable by design • Scale UP and OUT for free as part of the model • You get the PERFECT FABRIC for the CLOUD - elastic & dynamic
  • 21.
    Distributable by Design •Actors are location transparent & distributable by design • Scale UP and OUT for free as part of the model • You get the PERFECT FABRIC for the CLOUD - elastic & dynamic - fault-tolerant & self-healing
  • 22.
    Distributable by Design •Actors are location transparent & distributable by design • Scale UP and OUT for free as part of the model • You get the PERFECT FABRIC for the CLOUD - elastic & dynamic - fault-tolerant & self-healing - adaptive load-balancing, cluster rebalancing & actor migration
  • 23.
    Distributable by Design •Actors are location transparent & distributable by design • Scale UP and OUT for free as part of the model • You get the PERFECT FABRIC for the CLOUD - elastic & dynamic - fault-tolerant & self-healing - adaptive load-balancing, cluster rebalancing & actor migration - build extremely loosely coupled and dynamic systems that can change and adapt at runtime
  • 24.
    Selection of AkkaProduction Users
  • 26.
  • 27.
  • 28.
    Let’s use Actors How can we achieve this?
  • 29.
    What is anActor?
  • 30.
    What is anActor?
  • 31.
    What is anActor? • Akka's unit of code organization is called an Actor
  • 32.
    What is anActor? • Akka's unit of code organization is called an Actor • Actors helps you create concurrent, scalable and fault-tolerant applications
  • 33.
    What is anActor? • Akka's unit of code organization is called an Actor • Actors helps you create concurrent, scalable and fault-tolerant applications • Like Java EE servlets and session beans, Actors is a model for organizing your code that keeps many “policy decisions” separate from the business logic
  • 34.
    What is anActor? • Akka's unit of code organization is called an Actor • Actors helps you create concurrent, scalable and fault-tolerant applications • Like Java EE servlets and session beans, Actors is a model for organizing your code that keeps many “policy decisions” separate from the business logic • Actors may be new to many in the Java community, but they are a tried-and-true concept (Hewitt 1973) used for many years in telecom systems with 9 nines uptime
  • 36.
    Actors can beseen as Virtual Machines (nodes) in Cloud Computing
  • 38.
  • 39.
  • 41.
    ...that manages theirown memory and behavior
  • 42.
    ...that manages theirown memory and behavior
  • 44.
    Communicates with asynchronous non-blocking messages
  • 45.
    Communicates with asynchronous non-blocking messages
  • 47.
    Elastic - growand shrink on demand
  • 48.
    Elastic - growand shrink on demand
  • 49.
    Elastic - growand shrink on demand
  • 50.
    Elastic - growand shrink on demand
  • 52.
    Hot deploy -change behavior at runtime
  • 53.
    Hot deploy -change behavior at runtime
  • 54.
    Now - ifwe replace with Actor EVERYTHING will STILL HOLD for both LOCAL and DISTRIBUTED Actors
  • 55.
    What can Iuse Actors for?
  • 56.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to:
  • 57.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread
  • 58.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component
  • 59.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component - a callback or listener
  • 60.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component - a callback or listener - a singleton or service
  • 61.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component - a callback or listener - a singleton or service - a router, load-balancer or pool
  • 62.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component - a callback or listener - a singleton or service - a router, load-balancer or pool - a Java EE Session Bean or Message-Driven Bean
  • 63.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component - a callback or listener - a singleton or service - a router, load-balancer or pool - a Java EE Session Bean or Message-Driven Bean - an out-of-process service
  • 64.
    What can Iuse Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component - a callback or listener - a singleton or service - a router, load-balancer or pool - a Java EE Session Bean or Message-Driven Bean - an out-of-process service - a Finite State Machine (FSM)
  • 65.
    So, what isthe Actor Model?
  • 66.
    Carl Hewitt’s definition http://bit.ly/hewitt-on-actors
  • 67.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: http://bit.ly/hewitt-on-actors
  • 68.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing http://bit.ly/hewitt-on-actors
  • 69.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing - Storage http://bit.ly/hewitt-on-actors
  • 70.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing - Storage - Communication http://bit.ly/hewitt-on-actors
  • 71.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing - Storage - Communication - 3 axioms - When an Actor receives a message it can: http://bit.ly/hewitt-on-actors
  • 72.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing - Storage - Communication - 3 axioms - When an Actor receives a message it can: - Create new Actors http://bit.ly/hewitt-on-actors
  • 73.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing - Storage - Communication - 3 axioms - When an Actor receives a message it can: - Create new Actors - Send messages to Actors it knows http://bit.ly/hewitt-on-actors
  • 74.
    Carl Hewitt’s definition - The fundamental unit of computation that embodies: - Processing - Storage - Communication - 3 axioms - When an Actor receives a message it can: - Create new Actors - Send messages to Actors it knows - Designate how it should handle the next message it receives http://bit.ly/hewitt-on-actors
  • 75.
    4 core Actoroperations 0. DEFINE 1. CREATE 2. SEND 3. BECOME 4. SUPERVISE
  • 76.
    0. DEFINE public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } }
  • 77.
    0. DEFINE Define the message(s) the Actor should be able to respond to public class Greeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } }
  • 78.
    0. DEFINE Define the message(s) the Actor should be able to respond to public class Greeting implements Serializable { public final String who; Define the Actor class public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } }
  • 79.
    0. DEFINE Define the message(s) the Actor should be able to respond to public class Greeting implements Serializable { public final String who; Define the Actor class public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } Define the Actor’s behavior }
  • 80.
    Scala version case classGreeting(who: String) class GreetingActor extends Actor with ActorLogging { def receive = { case Greeting(who) => log.info("Hello {}", who) } }
  • 81.
    1. CREATE • CREATE- creates a new instance of an Actor • Extremely lightweight (2.7 Million per Gb RAM) • Very strong encapsulation - encapsulates: -  state -  behavior -  message queue • State & behavior is indistinguishable from each other • Only way to observe state is by sending an actor a message and see how it reacts
  • 82.
    CREATE Actor public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
  • 83.
    CREATE Actor public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } Create an Actor system } } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
  • 84.
    CREATE Actor public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } Create an Actor system } Actor configuration } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
  • 85.
    CREATE Actor public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } Create an Actor system } Actor configuration } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter"); Give it a name
  • 86.
    CREATE Actor public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } Create an Actor system } Actor configuration } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter"); Create the Actor Give it a name
  • 87.
    CREATE Actor public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } Create an Actor system } Actor configuration } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter"); Create the Actor You get an ActorRef back Give it a name
  • 88.
    Actors can formhierarchies Guardian System Actor
  • 89.
    Actors can formhierarchies Guardian System Actor system.actorOf(Props[Foo], “Foo”)
  • 90.
    Actors can formhierarchies Guardian System Actor Foo system.actorOf(Props[Foo], “Foo”)
  • 91.
    Actors can formhierarchies Guardian System Actor Foo context.actorOf(Props[A], “A”)
  • 92.
    Actors can formhierarchies Guardian System Actor Foo A context.actorOf(Props[A], “A”)
  • 93.
    Actors can formhierarchies Guardian System Actor Foo Bar A A C E C B B D
  • 94.
    Name resolution -like a file-system Guardian System Actor Foo Bar A A C E C B B D
  • 95.
    Name resolution -like a file-system Guardian System Actor /Foo Foo Bar A A C E C B B D
  • 96.
    Name resolution -like a file-system Guardian System Actor /Foo Foo Bar /Foo/A A A C E C B B D
  • 97.
    Name resolution -like a file-system Guardian System Actor /Foo Foo Bar /Foo/A A A C /Foo/A/B E C B B D
  • 98.
    Name resolution -like a file-system Guardian System Actor /Foo Foo Bar /Foo/A A A C /Foo/A/B E C B B D /Foo/A/D
  • 99.
  • 100.
    2. SEND • SEND- sends a message to an Actor
  • 101.
    2. SEND • SEND- sends a message to an Actor • Asynchronous and Non-blocking - Fire-forget
  • 102.
    2. SEND • SEND- sends a message to an Actor • Asynchronous and Non-blocking - Fire-forget • Everything happens Reactively
  • 103.
    2. SEND • SEND- sends a message to an Actor • Asynchronous and Non-blocking - Fire-forget • Everything happens Reactively - An Actor is passive until a message is sent to it, which triggers something within the Actor
  • 104.
    2. SEND • SEND- sends a message to an Actor • Asynchronous and Non-blocking - Fire-forget • Everything happens Reactively - An Actor is passive until a message is sent to it, which triggers something within the Actor - Messages is the Kinetic Energy in an Actor system
  • 105.
    2. SEND • SEND- sends a message to an Actor • Asynchronous and Non-blocking - Fire-forget • Everything happens Reactively - An Actor is passive until a message is sent to it, which triggers something within the Actor - Messages is the Kinetic Energy in an Actor system - Actors can have lots of buffered Potential Energy but can't do anything with it until it is triggered by a message
  • 106.
    2. SEND • SEND- sends a message to an Actor • Asynchronous and Non-blocking - Fire-forget • Everything happens Reactively - An Actor is passive until a message is sent to it, which triggers something within the Actor - Messages is the Kinetic Energy in an Actor system - Actors can have lots of buffered Potential Energy but can't do anything with it until it is triggered by a message • EVERYTHING is asynchronous and lockless
  • 107.
    Throughput on asingle box +50 million messages per second
  • 108.
    SEND message public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter"); greeter.tell(new Greeting("Charlie Parker"));
  • 109.
    SEND message public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter"); greeter.tell(new Greeting("Charlie Parker")); Send the message
  • 110.
    Full example public classGreeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello {}", ((Greeting) message).who); } } } ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter"); greeter.tell(new Greeting("Charlie Parker"));
  • 111.
    Scala version case classGreeting(who: String) class GreetingActor extends Actor with ActorLogging { def receive = { case Greeting(who) => log.info("Hello {}", who) } } val system = ActorSystem("MySystem") val greeter = system.actorOf(Props[GreetingActor], name = "greeter") greeter tell Greeting("Charlie Parker")
  • 112.
    Reply class SomeActor extendsUntypedActor { void onReceive(Object msg) { if (msg instanceof User) { User user = (User) msg; // reply to sender getSender().tell(“Hi ” + user.name); } } }
  • 113.
    Scala version class SomeActorextends Actor { def receive = { case User(name) => // reply to sender sender tell (“Hi ” + name) } }
  • 114.
    Remote deployment Just feedthe ActorSystem with this configuration akka { actor { provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = } } } }
  • 115.
    Remote deployment Just feedthe ActorSystem with this configuration Configure a Remote Provider akka { actor { provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = } } } }
  • 116.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = } } } }
  • 117.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = } } Define Remote Path } }
  • 118.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = akka:// } } Define Remote Path } Protocol }
  • 119.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = akka://MySystem } } Define Remote Path } Protocol Actor System }
  • 120.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = akka://MySystem@machine1 } } Define Remote Path } Protocol Actor System Hostname }
  • 121.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = akka://MySystem@machine1:2552 } } Define Remote Path } Protocol Actor System Hostname Port }
  • 122.
    Remote deployment Just feed the ActorSystem with this configuration Configure a Remote Provider akka { For the Greeter actor { actor provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = akka://MySystem@machine1:2552 } } Define Remote Path } Protocol Actor System Hostname Port } Zero code changes
  • 123.
  • 124.
    3. BECOME • BECOME- dynamically redefines Actor’s behavior
  • 125.
    3. BECOME • BECOME- dynamically redefines Actor’s behavior • Triggered reactively by receive of message
  • 126.
    3. BECOME • BECOME- dynamically redefines Actor’s behavior • Triggered reactively by receive of message • In a type system analogy it is as if the object changed type - changed interface, protocol & implementation
  • 127.
    3. BECOME • BECOME- dynamically redefines Actor’s behavior • Triggered reactively by receive of message • In a type system analogy it is as if the object changed type - changed interface, protocol & implementation • Will now react differently to the messages it receives
  • 128.
    3. BECOME • BECOME- dynamically redefines Actor’s behavior • Triggered reactively by receive of message • In a type system analogy it is as if the object changed type - changed interface, protocol & implementation • Will now react differently to the messages it receives • Behaviors are stacked & can be pushed and popped
  • 129.
    Why would Iwant to do that?
  • 130.
    Why would Iwant to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router
  • 131.
    Why would Iwant to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router • Implement an FSM (Finite State Machine)
  • 132.
    Why would Iwant to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router • Implement an FSM (Finite State Machine) • Implement graceful degradation
  • 133.
    Why would Iwant to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router • Implement an FSM (Finite State Machine) • Implement graceful degradation • Spawn up (empty) generic Worker processes that can become whatever the Master currently needs
  • 134.
    Why would Iwant to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router • Implement an FSM (Finite State Machine) • Implement graceful degradation • Spawn up (empty) generic Worker processes that can become whatever the Master currently needs • etc. use your imagination
  • 135.
    Why would Iwant to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router • Implement an FSM (Finite State Machine) • Implement graceful degradation • Spawn up (empty) generic Worker processes that can become whatever the Master currently needs • etc. use your imagination • Very useful once you get the used to it
  • 136.
    become context.become(new Procedure[Object]() { void apply(Object msg) { // new body if (msg instanceof NewMessage) { NewMessage newMsg = (NewMessage)msg; ... } } });
  • 137.
    Actor context available become from within an Actor context.become(new Procedure[Object]() { void apply(Object msg) { // new body if (msg instanceof NewMessage) { NewMessage newMsg = (NewMessage)msg; ... } } });
  • 138.
    Scala version context become { // new body case NewMessage => ... }
  • 139.
  • 140.
    Routers val router = system.actorOf( Props[SomeActor].withRouter( RoundRobinRouter(nrOfInstances = 5))) Scala API
  • 141.
    Router + Resizer valresizer = DefaultResizer(lowerBound = 2, upperBound = 15) val router = system.actorOf( Props[ExampleActor1].withRouter( RoundRobinRouter(resizer = Some(resizer)))) Scala API
  • 142.
    Failure management inJava/C/C# etc.
  • 143.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control
  • 144.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed
  • 145.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed • So you need to do all explicit error handling WITHIN this single thread
  • 146.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed • So you need to do all explicit error handling WITHIN this single thread • To make things worse - errors do not propagate between threads so there is NO WAY OF EVEN FINDING OUT that something have failed
  • 147.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed • So you need to do all explicit error handling WITHIN this single thread • To make things worse - errors do not propagate between threads so there is NO WAY OF EVEN FINDING OUT that something have failed • This leads to DEFENSIVE programming with:
  • 148.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed • So you need to do all explicit error handling WITHIN this single thread • To make things worse - errors do not propagate between threads so there is NO WAY OF EVEN FINDING OUT that something have failed • This leads to DEFENSIVE programming with: • Error handling TANGLED with business logic
  • 149.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed • So you need to do all explicit error handling WITHIN this single thread • To make things worse - errors do not propagate between threads so there is NO WAY OF EVEN FINDING OUT that something have failed • This leads to DEFENSIVE programming with: • Error handling TANGLED with business logic • SCATTERED all over the code base
  • 150.
    Failure management inJava/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed • So you need to do all explicit error handling WITHIN this single thread • To make things worse - errors do not propagate between threads so there is NO WAY OF EVEN FINDING OUT that something have failed • This leads to DEFENSIVE programming with: • Error handling TANGLED with business logic • SCATTERED all over the code base We can do better than this!!!
  • 151.
  • 152.
    4. SUPERVISE • SUPERVISE- manage another Actor’s failures
  • 153.
    4. SUPERVISE • SUPERVISE- manage another Actor’s failures • Error handling in actors is handle by letting Actors monitor (supervise) each other for failure
  • 154.
    4. SUPERVISE • SUPERVISE- manage another Actor’s failures • Error handling in actors is handle by letting Actors monitor (supervise) each other for failure • This means that if an Actor crashes, a notification will be sent to his supervisor, who can react upon the failure
  • 155.
    4. SUPERVISE • SUPERVISE- manage another Actor’s failures • Error handling in actors is handle by letting Actors monitor (supervise) each other for failure • This means that if an Actor crashes, a notification will be sent to his supervisor, who can react upon the failure • This provides clean separation of processing and error handling
  • 156.
  • 158.
    Which components have criticallyimportant state and explicit error handling?
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
    Node 1 Node 2 Error Kernel
  • 168.
    SUPERVISE Actor Every single actor has a default supervisor strategy. Which is usually sufficient. But it can be overridden.
  • 169.
    SUPERVISE Actor Every single actor has a default supervisor strategy. Which is usually sufficient. But it can be overridden. class Supervisor extends UntypedActor { private SupervisorStrategy strategy = new OneForOneStrategy( 10, Duration.parse("1 minute"), new Function<Throwable, Directive>() { @Override public Directive apply(Throwable t) { if (t instanceof ArithmeticException) return resume(); else if (t instanceof NullPointerException) return restart(); else return escalate(); } }); @Override public SupervisorStrategy supervisorStrategy() {
  • 170.
    SUPERVISE Actor class Supervisorextends UntypedActor { private SupervisorStrategy strategy = new OneForOneStrategy( 10, Duration.parse("1 minute"), new Function<Throwable, Directive>() { @Override public Directive apply(Throwable t) { if (t instanceof ArithmeticException) return resume(); else if (t instanceof NullPointerException) return restart(); else return escalate(); } }); @Override public SupervisorStrategy supervisorStrategy() { return strategy; } ActorRef worker = context.actorOf(new Props(Worker.class)); public void onReceive(Object message) throws Exception { if (message instanceof Integer) worker.forward(message); } }
  • 171.
    Scala version class Supervisorextends Actor { override val supervisorStrategy = (maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: ArithmeticException => Resume case _: NullPointerException => Restart case _: Exception => Escalate } val worker = context.actorOf(Props[Worker]) def receive = { case n: Int => worker forward n } }
  • 172.
    Scala version class Supervisorextends Actor { override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: ArithmeticException => Resume case _: NullPointerException => Restart case _: Exception => Escalate } val worker = context.actorOf(Props[Worker]) def receive = { case n: Int => worker forward n } }
  • 173.
    Scala version class Supervisorextends Actor { override val supervisorStrategy = AllForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: ArithmeticException => Resume case _: NullPointerException => Restart case _: Exception => Escalate } val worker = context.actorOf(Props[Worker]) def receive = { case n: Int => worker forward n } }
  • 174.
    Manage failure class Workerextends Actor { ... override def preRestart( reason: Throwable, message: Option[Any]) { ... // clean up before restart } override def postRestart(reason: Throwable) { ... // init after restart } } Scala API
  • 175.
  • 176.
    This was Akka 2.x Well...it’s a start...
  • 177.
    ...we have muchmuch more
  • 178.
    ...we have muchmuch more TestKit Cluster FSM IO HTTP/REST EventBus Durable Mailboxes Pub/Sub Camel Microkernel TypedActor SLF4J AMQP ZeroMQ Dataflow Transactors Agents Spring Extensions
  • 179.
    get it andlearn more http://akka.io http://letitcrash.com http://typesafe.com
  • 180.