Introducing Akka

Jonas Bonér
Jonas BonérFounder & CTO at Lightbend um Lightbend, Inc.
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
Introducing Akka
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
Introducing Akka
Actors can be seen as
Virtual Machines (nodes)
  in Cloud Computing
Introducing Akka
Encapsulated
and decoupled
 black boxes...
Encapsulated
and decoupled
 black boxes...
Introducing Akka
...that manages their own
   memory and behavior
...that manages their own
   memory and behavior
Introducing Akka
Communicates
with asynchronous
   non-blocking
     messages
Communicates
with asynchronous
   non-blocking
     messages
Introducing Akka
Elastic - grow and
shrink on demand
Elastic - grow and
shrink on demand
Elastic - grow and
shrink on demand
Elastic - grow and
shrink on demand
Introducing Akka
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
Introducing Akka
Which components have
critically important state
            and
 explicit error handling?
Introducing Akka
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
1 von 180

Recomendados

Akka Actor presentation von
Akka Actor presentationAkka Actor presentation
Akka Actor presentationGene Chang
4.7K views70 Folien
Introduction to Actor Model and Akka von
Introduction to Actor Model and AkkaIntroduction to Actor Model and Akka
Introduction to Actor Model and AkkaYung-Lin Ho
15.2K views23 Folien
Introduction to Akka - Atlanta Java Users Group von
Introduction to Akka - Atlanta Java Users GroupIntroduction to Akka - Atlanta Java Users Group
Introduction to Akka - Atlanta Java Users GroupRoy Russo
2.4K views87 Folien
Apache kafka performance(throughput) - without data loss and guaranteeing dat... von
Apache kafka performance(throughput) - without data loss and guaranteeing dat...Apache kafka performance(throughput) - without data loss and guaranteeing dat...
Apache kafka performance(throughput) - without data loss and guaranteeing dat...SANG WON PARK
3.8K views12 Folien
Reactive stream processing using Akka streams von
Reactive stream processing using Akka streams Reactive stream processing using Akka streams
Reactive stream processing using Akka streams Johan Andrén
1.1K views69 Folien
Kafka Streams: What it is, and how to use it? von
Kafka Streams: What it is, and how to use it?Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?confluent
1.9K views34 Folien

Más contenido relacionado

Was ist angesagt?

Multithreading and Actors von
Multithreading and ActorsMultithreading and Actors
Multithreading and ActorsDiego Pacheco
171 views48 Folien
Introduction to Kafka Streams von
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka StreamsGuozhang Wang
29.7K views136 Folien
Docker introduction von
Docker introductionDocker introduction
Docker introductionPhuc Nguyen
1.3K views62 Folien
Fundamentals of Apache Kafka von
Fundamentals of Apache KafkaFundamentals of Apache Kafka
Fundamentals of Apache KafkaChhavi Parasher
996 views65 Folien
Patterns of resilience von
Patterns of resiliencePatterns of resilience
Patterns of resilienceUwe Friedrichsen
49.1K views81 Folien
Kafka replication apachecon_2013 von
Kafka replication apachecon_2013Kafka replication apachecon_2013
Kafka replication apachecon_2013Jun Rao
21.3K views31 Folien

Was ist angesagt?(20)

Introduction to Kafka Streams von Guozhang Wang
Introduction to Kafka StreamsIntroduction to Kafka Streams
Introduction to Kafka Streams
Guozhang Wang29.7K views
Docker introduction von Phuc Nguyen
Docker introductionDocker introduction
Docker introduction
Phuc Nguyen1.3K views
Kafka replication apachecon_2013 von Jun Rao
Kafka replication apachecon_2013Kafka replication apachecon_2013
Kafka replication apachecon_2013
Jun Rao21.3K views
Universal metrics with Apache Beam von Etienne Chauchot
Universal metrics with Apache BeamUniversal metrics with Apache Beam
Universal metrics with Apache Beam
Etienne Chauchot14.6K views
Understanding Reactive Programming von Andres Almiray
Understanding Reactive ProgrammingUnderstanding Reactive Programming
Understanding Reactive Programming
Andres Almiray1.2K views
Introduction to Apache Kafka von Jeff Holoman
Introduction to Apache KafkaIntroduction to Apache Kafka
Introduction to Apache Kafka
Jeff Holoman52.2K views
Introduction to Apache Camel von Claus Ibsen
Introduction to Apache CamelIntroduction to Apache Camel
Introduction to Apache Camel
Claus Ibsen5.6K views
MySQL/MariaDB Proxy Software Test von I Goo Lee
MySQL/MariaDB Proxy Software TestMySQL/MariaDB Proxy Software Test
MySQL/MariaDB Proxy Software Test
I Goo Lee2K views
Introduction to Docker - 2017 von Docker, Inc.
Introduction to Docker - 2017Introduction to Docker - 2017
Introduction to Docker - 2017
Docker, Inc.78.1K views
Scalability, Availability & Stability Patterns von Jonas Bonér
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability Patterns
Jonas Bonér515.7K views
Introduction to Apache ZooKeeper von Saurav Haloi
Introduction to Apache ZooKeeperIntroduction to Apache ZooKeeper
Introduction to Apache ZooKeeper
Saurav Haloi128.4K views
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안 von SANG WON PARK
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
SANG WON PARK15.2K views
APACHE KAFKA / Kafka Connect / Kafka Streams von Ketan Gote
APACHE KAFKA / Kafka Connect / Kafka StreamsAPACHE KAFKA / Kafka Connect / Kafka Streams
APACHE KAFKA / Kafka Connect / Kafka Streams
Ketan Gote490 views
Routed Provider Networks on OpenStack von Romana Project
Routed Provider Networks on OpenStack Routed Provider Networks on OpenStack
Routed Provider Networks on OpenStack
Romana Project1.8K views
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013 von mumrah
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
mumrah61.2K views

Destacado

Reactive Revealed Part 3 of 3: Resiliency, Failures vs Errors, Isolation, Del... von
Reactive Revealed Part 3 of 3: Resiliency, Failures vs Errors, Isolation, Del...Reactive Revealed Part 3 of 3: Resiliency, Failures vs Errors, Isolation, Del...
Reactive Revealed Part 3 of 3: Resiliency, Failures vs Errors, Isolation, Del...Legacy Typesafe (now Lightbend)
6.1K views189 Folien
Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl... von
Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl...Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl...
Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl...Lightbend
12.3K views106 Folien
Zen of Akka von
Zen of AkkaZen of Akka
Zen of AkkaKonrad Malawski
29.4K views136 Folien
Advanced akka features von
Advanced akka featuresAdvanced akka features
Advanced akka featuresGrzegorz Duda
1.5K views112 Folien
Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac... von
Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac...Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac...
Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac...Jonas Bonér
54.3K views162 Folien
Reactive Stream Processing with Akka Streams von
Reactive Stream Processing with Akka StreamsReactive Stream Processing with Akka Streams
Reactive Stream Processing with Akka StreamsKonrad Malawski
14.2K views123 Folien

Destacado(8)

Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl... von Lightbend
Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl...Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl...
Akka Revealed: A JVM Architect's Journey From Resilient Actors To Scalable Cl...
Lightbend12.3K views
Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac... von Jonas Bonér
Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac...Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac...
Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Ac...
Jonas Bonér54.3K views
Reactive Stream Processing with Akka Streams von Konrad Malawski
Reactive Stream Processing with Akka StreamsReactive Stream Processing with Akka Streams
Reactive Stream Processing with Akka Streams
Konrad Malawski14.2K views
Akka in Production - ScalaDays 2015 von Evan Chan
Akka in Production - ScalaDays 2015Akka in Production - ScalaDays 2015
Akka in Production - ScalaDays 2015
Evan Chan53.3K views
High Performance TensorFlow in Production - Big Data Spain - Madrid - Nov 15 ... von Chris Fregly
High Performance TensorFlow in Production - Big Data Spain - Madrid - Nov 15 ...High Performance TensorFlow in Production - Big Data Spain - Madrid - Nov 15 ...
High Performance TensorFlow in Production - Big Data Spain - Madrid - Nov 15 ...
Chris Fregly3K views

Similar a Introducing Akka

Scaling software with akka von
Scaling software with akkaScaling software with akka
Scaling software with akkascalaconfjp
3.8K views154 Folien
Build Cloud Applications with Akka and Heroku von
Build Cloud Applications with Akka and HerokuBuild Cloud Applications with Akka and Heroku
Build Cloud Applications with Akka and HerokuSalesforce Developers
3.2K views60 Folien
Test driven infrastructure development (2 - puppetconf 2013 edition) von
Test driven infrastructure development (2 - puppetconf 2013 edition)Test driven infrastructure development (2 - puppetconf 2013 edition)
Test driven infrastructure development (2 - puppetconf 2013 edition)Tomas Doran
1.6K views61 Folien
The Ember.js Framework - Everything You Need To Know von
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowAll Things Open
1.6K views69 Folien
Орхан Гасимов: "Reactive Applications in Java with Akka" von
Орхан Гасимов: "Reactive Applications in Java with Akka"Орхан Гасимов: "Reactive Applications in Java with Akka"
Орхан Гасимов: "Reactive Applications in Java with Akka"Anna Shymchenko
543 views39 Folien
Typesafe Reactive Platform: Monitoring 1.0, Commercial features and more von
Typesafe Reactive Platform: Monitoring 1.0, Commercial features and moreTypesafe Reactive Platform: Monitoring 1.0, Commercial features and more
Typesafe Reactive Platform: Monitoring 1.0, Commercial features and moreLegacy Typesafe (now Lightbend)
3.1K views64 Folien

Similar a Introducing Akka(20)

Scaling software with akka von scalaconfjp
Scaling software with akkaScaling software with akka
Scaling software with akka
scalaconfjp3.8K views
Test driven infrastructure development (2 - puppetconf 2013 edition) von Tomas Doran
Test driven infrastructure development (2 - puppetconf 2013 edition)Test driven infrastructure development (2 - puppetconf 2013 edition)
Test driven infrastructure development (2 - puppetconf 2013 edition)
Tomas Doran1.6K views
The Ember.js Framework - Everything You Need To Know von All Things Open
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To Know
All Things Open1.6K views
Орхан Гасимов: "Reactive Applications in Java with Akka" von Anna Shymchenko
Орхан Гасимов: "Reactive Applications in Java with Akka"Орхан Гасимов: "Reactive Applications in Java with Akka"
Орхан Гасимов: "Reactive Applications in Java with Akka"
Anna Shymchenko543 views
Learn you some Ansible for great good! von David Lapsley
Learn you some Ansible for great good!Learn you some Ansible for great good!
Learn you some Ansible for great good!
David Lapsley1.7K views
Clojure Conj 2014 - Paradigms of core.async - Julian Gamble von Julian Gamble
Clojure Conj 2014 - Paradigms of core.async - Julian GambleClojure Conj 2014 - Paradigms of core.async - Julian Gamble
Clojure Conj 2014 - Paradigms of core.async - Julian Gamble
Julian Gamble1.5K views
Akka london scala_user_group von Skills Matter
Akka london scala_user_groupAkka london scala_user_group
Akka london scala_user_group
Skills Matter1.1K views
OpenNebulaConf2015 1.07 Cloud for Scientific Computing @ STFC - Alexander Dibbo von OpenNebula Project
OpenNebulaConf2015 1.07 Cloud for Scientific Computing @ STFC - Alexander DibboOpenNebulaConf2015 1.07 Cloud for Scientific Computing @ STFC - Alexander Dibbo
OpenNebulaConf2015 1.07 Cloud for Scientific Computing @ STFC - Alexander Dibbo
OpenNebula Project603 views
Modelling Microservices at Spotify - Petter Mahlen von J On The Beach
Modelling Microservices at Spotify - Petter MahlenModelling Microservices at Spotify - Petter Mahlen
Modelling Microservices at Spotify - Petter Mahlen
J On The Beach2.9K views
Reactive applications and Akka intro used in the Madrid Scala Meetup von Miguel Pastor
Reactive applications and Akka intro used in the Madrid Scala MeetupReactive applications and Akka intro used in the Madrid Scala Meetup
Reactive applications and Akka intro used in the Madrid Scala Meetup
Miguel Pastor1.2K views
Building Applications with the Typesafe Reactive Platform at Skills Matter, L... von Lutz Hühnken
Building Applications with the Typesafe Reactive Platform at Skills Matter, L...Building Applications with the Typesafe Reactive Platform at Skills Matter, L...
Building Applications with the Typesafe Reactive Platform at Skills Matter, L...
Lutz Hühnken479 views
CQRS Evolved - CQRS + Akka.NET von David Hoerster
CQRS Evolved - CQRS + Akka.NETCQRS Evolved - CQRS + Akka.NET
CQRS Evolved - CQRS + Akka.NET
David Hoerster6.3K views
Operational Visibiliy and Analytics - BU Seminar von Canturk Isci
Operational Visibiliy and Analytics - BU SeminarOperational Visibiliy and Analytics - BU Seminar
Operational Visibiliy and Analytics - BU Seminar
Canturk Isci991 views
High performance network programming on the jvm oscon 2012 von Erik Onnen
High performance network programming on the jvm   oscon 2012 High performance network programming on the jvm   oscon 2012
High performance network programming on the jvm oscon 2012
Erik Onnen121.6K views

Más de Jonas Bonér

The Reactive Principles: Design Principles For Cloud Native Applications von
The Reactive Principles: Design Principles For Cloud Native ApplicationsThe Reactive Principles: Design Principles For Cloud Native Applications
The Reactive Principles: Design Principles For Cloud Native ApplicationsJonas Bonér
1.3K views104 Folien
Cloudstate—Towards Stateful Serverless von
Cloudstate—Towards Stateful ServerlessCloudstate—Towards Stateful Serverless
Cloudstate—Towards Stateful ServerlessJonas Bonér
667 views173 Folien
Designing Events-first Microservices von
Designing Events-first MicroservicesDesigning Events-first Microservices
Designing Events-first MicroservicesJonas Bonér
1.6K views156 Folien
How Events Are Reshaping Modern Systems von
How Events Are Reshaping Modern SystemsHow Events Are Reshaping Modern Systems
How Events Are Reshaping Modern SystemsJonas Bonér
1.8K views165 Folien
Reactive Microsystems: The Evolution of Microservices at Scale von
Reactive Microsystems: The Evolution of Microservices at ScaleReactive Microsystems: The Evolution of Microservices at Scale
Reactive Microsystems: The Evolution of Microservices at ScaleJonas Bonér
3K views75 Folien
From Microliths To Microsystems von
From Microliths To MicrosystemsFrom Microliths To Microsystems
From Microliths To MicrosystemsJonas Bonér
6.4K views84 Folien

Más de Jonas Bonér(16)

The Reactive Principles: Design Principles For Cloud Native Applications von Jonas Bonér
The Reactive Principles: Design Principles For Cloud Native ApplicationsThe Reactive Principles: Design Principles For Cloud Native Applications
The Reactive Principles: Design Principles For Cloud Native Applications
Jonas Bonér1.3K views
Cloudstate—Towards Stateful Serverless von Jonas Bonér
Cloudstate—Towards Stateful ServerlessCloudstate—Towards Stateful Serverless
Cloudstate—Towards Stateful Serverless
Jonas Bonér667 views
Designing Events-first Microservices von Jonas Bonér
Designing Events-first MicroservicesDesigning Events-first Microservices
Designing Events-first Microservices
Jonas Bonér1.6K views
How Events Are Reshaping Modern Systems von Jonas Bonér
How Events Are Reshaping Modern SystemsHow Events Are Reshaping Modern Systems
How Events Are Reshaping Modern Systems
Jonas Bonér1.8K views
Reactive Microsystems: The Evolution of Microservices at Scale von Jonas Bonér
Reactive Microsystems: The Evolution of Microservices at ScaleReactive Microsystems: The Evolution of Microservices at Scale
Reactive Microsystems: The Evolution of Microservices at Scale
Jonas Bonér3K views
From Microliths To Microsystems von Jonas Bonér
From Microliths To MicrosystemsFrom Microliths To Microsystems
From Microliths To Microsystems
Jonas Bonér6.4K views
Without Resilience, Nothing Else Matters von Jonas Bonér
Without Resilience, Nothing Else MattersWithout Resilience, Nothing Else Matters
Without Resilience, Nothing Else Matters
Jonas Bonér16.2K views
Life Beyond the Illusion of Present von Jonas Bonér
Life Beyond the Illusion of PresentLife Beyond the Illusion of Present
Life Beyond the Illusion of Present
Jonas Bonér81.7K views
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems von Jonas Bonér
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven SystemsGo Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Go Reactive: Building Responsive, Resilient, Elastic & Message-Driven Systems
Jonas Bonér8.6K views
Reactive Supply To Changing Demand von Jonas Bonér
Reactive Supply To Changing DemandReactive Supply To Changing Demand
Reactive Supply To Changing Demand
Jonas Bonér4.8K views
Building Reactive Systems with Akka (in Java 8 or Scala) von Jonas Bonér
Building Reactive Systems with Akka (in Java 8 or Scala)Building Reactive Systems with Akka (in Java 8 or Scala)
Building Reactive Systems with Akka (in Java 8 or Scala)
Jonas Bonér28.1K views
Go Reactive: Event-Driven, Scalable, Resilient & Responsive Systems von Jonas Bonér
Go Reactive: Event-Driven, Scalable, Resilient & Responsive SystemsGo Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
Go Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
Jonas Bonér30.9K views
Building Scalable, Highly Concurrent & Fault Tolerant Systems - Lessons Learned von Jonas Bonér
Building Scalable, Highly Concurrent & Fault Tolerant Systems -  Lessons LearnedBuilding Scalable, Highly Concurrent & Fault Tolerant Systems -  Lessons Learned
Building Scalable, Highly Concurrent & Fault Tolerant Systems - Lessons Learned
Jonas Bonér41.8K views
Event Driven-Architecture from a Scalability perspective von Jonas Bonér
Event Driven-Architecture from a Scalability perspectiveEvent Driven-Architecture from a Scalability perspective
Event Driven-Architecture from a Scalability perspective
Jonas Bonér11.8K views
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM von Jonas Bonér
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVMState: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
State: You're Doing It Wrong - Alternative Concurrency Paradigms For The JVM
Jonas Bonér11.9K views
Pragmatic Real-World Scala (short version) von Jonas Bonér
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
Jonas Bonér72.8K views

Último

Uni Systems for Power Platform.pptx von
Uni Systems for Power Platform.pptxUni Systems for Power Platform.pptx
Uni Systems for Power Platform.pptxUni Systems S.M.S.A.
50 views21 Folien
.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV von
.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV
.conf Go 2023 - How KPN drives Customer Satisfaction on IPTVSplunk
88 views20 Folien
Throughput von
ThroughputThroughput
ThroughputMoisés Armani Ramírez
36 views11 Folien
The details of description: Techniques, tips, and tangents on alternative tex... von
The details of description: Techniques, tips, and tangents on alternative tex...The details of description: Techniques, tips, and tangents on alternative tex...
The details of description: Techniques, tips, and tangents on alternative tex...BookNet Canada
121 views24 Folien
Future of Learning - Yap Aye Wee.pdf von
Future of Learning - Yap Aye Wee.pdfFuture of Learning - Yap Aye Wee.pdf
Future of Learning - Yap Aye Wee.pdfNUS-ISS
41 views11 Folien
Spesifikasi Lengkap ASUS Vivobook Go 14 von
Spesifikasi Lengkap ASUS Vivobook Go 14Spesifikasi Lengkap ASUS Vivobook Go 14
Spesifikasi Lengkap ASUS Vivobook Go 14Dot Semarang
35 views1 Folie

Último(20)

.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV von Splunk
.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV
.conf Go 2023 - How KPN drives Customer Satisfaction on IPTV
Splunk88 views
The details of description: Techniques, tips, and tangents on alternative tex... von BookNet Canada
The details of description: Techniques, tips, and tangents on alternative tex...The details of description: Techniques, tips, and tangents on alternative tex...
The details of description: Techniques, tips, and tangents on alternative tex...
BookNet Canada121 views
Future of Learning - Yap Aye Wee.pdf von NUS-ISS
Future of Learning - Yap Aye Wee.pdfFuture of Learning - Yap Aye Wee.pdf
Future of Learning - Yap Aye Wee.pdf
NUS-ISS41 views
Spesifikasi Lengkap ASUS Vivobook Go 14 von Dot Semarang
Spesifikasi Lengkap ASUS Vivobook Go 14Spesifikasi Lengkap ASUS Vivobook Go 14
Spesifikasi Lengkap ASUS Vivobook Go 14
Dot Semarang35 views
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu... von NUS-ISS
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
NUS-ISS37 views
Combining Orchestration and Choreography for a Clean Architecture von ThomasHeinrichs1
Combining Orchestration and Choreography for a Clean ArchitectureCombining Orchestration and Choreography for a Clean Architecture
Combining Orchestration and Choreography for a Clean Architecture
ThomasHeinrichs169 views
Special_edition_innovator_2023.pdf von WillDavies22
Special_edition_innovator_2023.pdfSpecial_edition_innovator_2023.pdf
Special_edition_innovator_2023.pdf
WillDavies2216 views
Beyond the Hype: What Generative AI Means for the Future of Work - Damien Cum... von NUS-ISS
Beyond the Hype: What Generative AI Means for the Future of Work - Damien Cum...Beyond the Hype: What Generative AI Means for the Future of Work - Damien Cum...
Beyond the Hype: What Generative AI Means for the Future of Work - Damien Cum...
NUS-ISS34 views
How the World's Leading Independent Automotive Distributor is Reinventing Its... von NUS-ISS
How the World's Leading Independent Automotive Distributor is Reinventing Its...How the World's Leading Independent Automotive Distributor is Reinventing Its...
How the World's Leading Independent Automotive Distributor is Reinventing Its...
NUS-ISS15 views
Voice Logger - Telephony Integration Solution at Aegis von Nirmal Sharma
Voice Logger - Telephony Integration Solution at AegisVoice Logger - Telephony Integration Solution at Aegis
Voice Logger - Telephony Integration Solution at Aegis
Nirmal Sharma17 views
Five Things You SHOULD Know About Postman von Postman
Five Things You SHOULD Know About PostmanFive Things You SHOULD Know About Postman
Five Things You SHOULD Know About Postman
Postman27 views
Igniting Next Level Productivity with AI-Infused Data Integration Workflows von Safe Software
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software225 views
Business Analyst Series 2023 - Week 3 Session 5 von DianaGray10
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5
DianaGray10209 views
Attacking IoT Devices from a Web Perspective - Linux Day von Simone Onofri
Attacking IoT Devices from a Web Perspective - Linux Day Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day
Simone Onofri15 views
RADIUS-Omnichannel Interaction System von RADIUS
RADIUS-Omnichannel Interaction SystemRADIUS-Omnichannel Interaction System
RADIUS-Omnichannel Interaction System
RADIUS15 views

Introducing Akka

  • 1. Introducing Jonas Bonér CTO Typesafe
  • 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
  • 5. Vision Simpler Concurrency Scalability Fault-tolerance
  • 6. Vision ...with a single unified Programming Model Managed Runtime Open Source Distribution
  • 8. Scale UP & Scale OUT
  • 9. Program at a Higher Level
  • 10. Program at a Higher Level
  • 11. Program at a Higher Level • Never think in terms of shared state, state visibility, threads, locks, concurrent collections, thread notifications etc.
  • 12. 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
  • 13. 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
  • 14. 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
  • 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 Akka Production Users
  • 28. Let’s use Actors How can we achieve this?
  • 29. What is an Actor?
  • 30. What is an Actor?
  • 31. What is an Actor? • Akka's unit of code organization is called an Actor
  • 32. What is an Actor? • Akka's unit of code organization is called an Actor • Actors helps you create concurrent, scalable and fault-tolerant applications
  • 33. 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
  • 34. 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
  • 36. Actors can be seen as Virtual Machines (nodes) in Cloud Computing
  • 41. ...that manages their own memory and behavior
  • 42. ...that manages their own memory and behavior
  • 44. Communicates with asynchronous non-blocking messages
  • 45. Communicates with asynchronous non-blocking messages
  • 47. Elastic - grow and shrink on demand
  • 48. Elastic - grow and shrink on demand
  • 49. Elastic - grow and shrink on demand
  • 50. Elastic - grow and shrink on demand
  • 52. Hot deploy - change behavior at runtime
  • 53. Hot deploy - change behavior at runtime
  • 54. Now - if we replace with Actor EVERYTHING will STILL HOLD for both LOCAL and DISTRIBUTED Actors
  • 55. What can I use Actors for?
  • 56. What can I use Actors for? In different scenarios, an Actor may be an alternative to:
  • 57. What can I use Actors for? In different scenarios, an Actor may be an alternative to: - a thread
  • 58. What can I use Actors for? In different scenarios, an Actor may be an alternative to: - a thread - an object instance or component
  • 59. 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
  • 60. 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
  • 61. 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
  • 62. 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
  • 63. 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
  • 64. 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)
  • 65. So, what is the 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 Actor operations 0. DEFINE 1. CREATE 2. SEND 3. BECOME 4. SUPERVISE
  • 76. 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); } } }
  • 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 class Greeting(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 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");
  • 83. 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");
  • 84. 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");
  • 85. 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
  • 86. 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
  • 87. 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
  • 88. Actors can form hierarchies Guardian System Actor
  • 89. Actors can form hierarchies Guardian System Actor system.actorOf(Props[Foo], “Foo”)
  • 90. Actors can form hierarchies Guardian System Actor Foo system.actorOf(Props[Foo], “Foo”)
  • 91. Actors can form hierarchies Guardian System Actor Foo context.actorOf(Props[A], “A”)
  • 92. Actors can form hierarchies Guardian System Actor Foo A context.actorOf(Props[A], “A”)
  • 93. Actors can form hierarchies 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
  • 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 a single box +50 million messages per second
  • 108. 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"));
  • 109. 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
  • 110. 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"));
  • 111. 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")
  • 112. 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); } } }
  • 113. Scala version class SomeActor extends Actor { def receive = { case User(name) => // reply to sender sender tell (“Hi ” + name) } }
  • 114. Remote deployment Just feed the ActorSystem with this configuration akka { actor { provider = akka.remote.RemoteActorRefProvider deployment { /Greeter { remote = } } } }
  • 115. Remote deployment Just feed the 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
  • 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 I want to do that?
  • 130. Why would I want to do that? • Let a highly contended Actor adaptively transform himself into an Actor Pool or a Router
  • 131. 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)
  • 132. 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
  • 133. 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
  • 134. 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
  • 135. 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
  • 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 => ... }
  • 140. Routers val router = system.actorOf( Props[SomeActor].withRouter( RoundRobinRouter(nrOfInstances = 5))) Scala API
  • 141. Router + Resizer val resizer = DefaultResizer(lowerBound = 2, upperBound = 15) val router = system.actorOf( Props[ExampleActor1].withRouter( RoundRobinRouter(resizer = Some(resizer)))) Scala API
  • 142. Failure management in Java/C/C# etc.
  • 143. Failure management in Java/C/C# etc. • You are given a SINGLE thread of control
  • 144. Failure management in Java/C/C# etc. • You are given a SINGLE thread of control • If this thread blows up you are screwed
  • 145. 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
  • 146. 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
  • 147. 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:
  • 148. 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
  • 149. 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
  • 150. 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!!!
  • 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. ...let’s take a standard OO application
  • 158. Which components have critically important state and explicit error handling?
  • 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 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); } }
  • 171. 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 } }
  • 172. 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 } }
  • 173. 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 } }
  • 174. 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
  • 176. This was Akka 2.x Well...it’s a start...
  • 177. ...we have much much more
  • 178. ...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
  • 179. get it and learn more http://akka.io http://letitcrash.com http://typesafe.com
  • 180. EOF