Einführung in das Actor Model mit .net
akka.net
Über mich
 Software Engineer, Principal @ Progress Software
 ralph.waldenmaier@progress.com
 @eigeneachse
 Sprecher auf Konferenzen und User Groups
 Freier Autor für donetpro
Ralph Waldenmaier
Ziel
 Enwticklung von Anwendungen
 Skalierbar
 Fehlertolerant
 Selbst heilend
 Verteilt
 Was ist das Actor Model
 Was ist akka.net
Actor Model – Die Theorie
Quelle: https://de.wikipedia.org/wiki/Actor_Model
Wikipedia (https://de.wikipedia.org/wiki/Actor_Model):
„Das Actor Model (deutsch Aktorenmodell) ist in der Informatik ein Modell für
nebenläufige Rechnungen bzw. Programme. Diese werden in nebenläufige
Einheiten, sog. Aktoren, unterteilt, die ausschließlich über
Nachrichtenaustausch kommunizieren.“
 1973
 Carl Hewitt, Peter Bishop und Richard Steiger
 Implementierungen
 Erlang
 Scala
 C#
Actor Model – Die Theorie #2
Quelle: https://de.wikipedia.org/wiki/Actor_Model
“An island of sanity in a sea of concurrency”
“Shared nothing”
“Black box”
“Location transparent”
“Distributable by design”
 Drei Grundsätze
 Send: Nachrichten an sich selbst oder andere Aktoren verschicken
 Create: Neue Aktoren erzeugen
 Behavior: Das eigene Verhalten ändern
Wer nutzt das?
 WhatsApp (Erlang)
 RabbitMQ (Erlang)
 CouchDB (Erlang)
 LinkedIn.com (JVM Akka)
 Walmart.com (JVM Akka)
 Bank of America Merrill Lynch (Akka.net)
 Halo ( Project Orleans )
Wofür verwende ich das?
 Alternative zu Threading
 Message routing
 State machines
 CQRS / Event Driven Design
 IoT
 Singleton
.net Entwicklung heute
Service
BLL
DAO
Telerik Data Access
DB
DAO2
RestHandler
WebApi
Service
BLL
DAO
Telerik Data Access
DB
DAO2
RestHandler
WebApi
Service
BLL
DAO
Telerik Data Access
DB
DAO2
RestHandler
WebApi
CPU 2
MSMQ
Server 1 Server 2
Skalierung
 Parallel LINQ
 TPL – async/await
 Threads
 WCF
 WebAPI
 MSMQ / RabbitMQ / Azure Queues
Elastic?
ActorX
ActorY
ActorZCPU 2
Server 1 Server 2
Skalierung mit akka.net
Elastic!
Akka.Actor
Akka.Remote
Akka.Cluster
ActorX
ActorY
ActorZ
Akka.net
 Initial Entwickelt von Roger Johansson und Aaron Stannard
 OpenSource ( Apache 2 License )
 Orientiert sich an den Features der JVM Akka Implementierung
 ~ 5 core Entwickler
 ~ 70 github contributor
 Akka.net Version 1.0 – Q1/2015
 Aktuell 1.04
 C# und F# API
 .net und Mono
 ~ 50 mio msg/sec auf einer Maschine
 ~ 2,5 millionen actors / GB RAM
 Reactive Manifesto ( Responsive, Resilient, Elastic, Message Driven )
akka.net
Wie funktioniert ein Actor?
Quelle: http://getakka.net/docs/concepts/actors
Actor Lifecycle
Actor
initializes
Starting
Actor is up
and now
able to
process
messages
Receiving
Actor
cleans up
Stopping
Actor is
dead
Terminated
Actor is
going to
restart
Restarting
PreStart()
PostRestart()
PreRestart()
PostStop()
PostStop()
DispatcherThreadPool
Actor1 Actor1 Actor2
Actor2 Actor3
Actor4 Actor4
Actor1
Actor3 Actor4
Actor2
Actor1
Actor3
Actor2
Time
 ThreadPoolDispatcher ( default, max concurrency )
 TaskDispatcher ( TPL )
 CurrentSynchronizationContextDispatcher ( UI sync )
 …
Demo Akka.Actor
 Hello World
 Actor System
 ReceiveActor
 ActorRef
Server 1
ActorX
ActorY
ActorZ
Demo Akka.Remote #1
 Chat app
 ActorSelection
 RemoteActorRefProvider Akka.Remote
ActorX
ActorY
ActorZ
ActorX
ActorY
ActorZ
Demo Akka.Remote #2
 Remote deployment
 Remote daemon
Akka.Remote
ActorX
ActorY
ActorZ
ActorX
ActorY
ActorZ
ActorA*
Router
 Leitet Nachrichten an „routee“ Actors weiter
 Group vs. Pool Router
 RoundRobinRouter
 ScatterGatherFirstCompletedRouter
 BroadcastRouter
 ConsistentHashingRouter
 SmallestMailboxRouter
 Elastische pools
Router konfiguration
akka.actor.deployment {
/some-pool {
router = round-robin-pool
nr-of-instances = 5
}
}
// Hocon config
var router = system.ActorOf(Props.Create<Worker>().WithRouter(FromConfig.Instance),
"some-pool");
// Code config
var router = system.ActorOf(Props.Create<Worker>().WithRouter(
new RoundRobinPool(5)), "some-pool");
RoundRobinRouter
12
1
2
3
34
4
Router
Routee1
Routee2
Routee3
Eingang Ausgang
ScatterGatherFirstCompleted
1
2
3
Router
Routee1
Routee2
Routee3
Eingang Ausgang
Sender
?
!
Elastische pools
akka.actor.deployment
{
/my-router
{
router = round-robin-pool
resizer
{
enabled = on
lower-bound = 1
upper-bound = 10
messages-per-resize = 10
ramp-up-rate = 0.2
pressure-threshold = 1
backoff-threshold = 0.3
…
}
}
}
Demo Akka.Routing
 RoundRobin
 Deployment configuration
Supervision
 Jeder Actor wird durch einen anderen Actor überwacht, welcher entscheidet,
wie im Fehlerfall zu reagieren ist.
 Restart
 Teminate
 Ignore and Resume
 Escalate an eigenen Supervisor
 Selbstheilung
ErrorHandling – OneForOne
Quelle: http://getakka.net/docs/concepts/supervision
ErrorHandling – AllForOne
Quelle: http://getakka.net/docs/concepts/supervision
Error handling
protected override SupervisorStrategy SupervisorStrategy()
{
return new OneForOneStrategy( // oder AllForOneStrategy
maxNumberOfRetries: 10,
duration: TimeSpan.FromSeconds(30),
decider: x =>
{
if (x is ArithmeticException) return Directive.Resume;
else if (x is NotSupportedException) return Directive.Stop;
else if (x is ArgumentOutOfRangeException) return Directive.Escalate;
else return Directive.Restart;
});
}
Switchable Behavior
private void Lebendig(){
…//other code
if (this.lebenspunkte <= 0)
this.Become(Tot);
…
}
private void Tot(){
Receive<Wiederbeleben>(() => {
this.lebenspunkte = this.maxLebenspunkte;
this.Become(Lebendig);
});
}
Weitere Features
 Cluster
 Cluster Sharding
 Dependency Injection – Autofac
 Persistence
 Finite State Machines
 F# API
Wie gehts weiter?
 http://getakka.net/
 https://github.com/akkadotnet/akka.net/tree/dev/src/examples
 https://gitter.im/akkadotnet/akka.net
 https://petabridge.com/bootcamp/ (kostenlos)
 https://petabridge.com/
Q & A
 http://www.dotnet-developer-conference.de/
 30. November bis 02. Dezember 2015
 Pullman Hotel Köln
 Frühbucher
 Bis 16. Oktober

Einführung in das Actor Model mit Akka.net

  • 1.
    Einführung in dasActor Model mit .net akka.net
  • 2.
    Über mich  SoftwareEngineer, Principal @ Progress Software  [email protected]  @eigeneachse  Sprecher auf Konferenzen und User Groups  Freier Autor für donetpro Ralph Waldenmaier
  • 3.
    Ziel  Enwticklung vonAnwendungen  Skalierbar  Fehlertolerant  Selbst heilend  Verteilt  Was ist das Actor Model  Was ist akka.net
  • 4.
    Actor Model –Die Theorie Quelle: https://de.wikipedia.org/wiki/Actor_Model Wikipedia (https://de.wikipedia.org/wiki/Actor_Model): „Das Actor Model (deutsch Aktorenmodell) ist in der Informatik ein Modell für nebenläufige Rechnungen bzw. Programme. Diese werden in nebenläufige Einheiten, sog. Aktoren, unterteilt, die ausschließlich über Nachrichtenaustausch kommunizieren.“  1973  Carl Hewitt, Peter Bishop und Richard Steiger  Implementierungen  Erlang  Scala  C#
  • 5.
    Actor Model –Die Theorie #2 Quelle: https://de.wikipedia.org/wiki/Actor_Model “An island of sanity in a sea of concurrency” “Shared nothing” “Black box” “Location transparent” “Distributable by design”  Drei Grundsätze  Send: Nachrichten an sich selbst oder andere Aktoren verschicken  Create: Neue Aktoren erzeugen  Behavior: Das eigene Verhalten ändern
  • 6.
    Wer nutzt das? WhatsApp (Erlang)  RabbitMQ (Erlang)  CouchDB (Erlang)  LinkedIn.com (JVM Akka)  Walmart.com (JVM Akka)  Bank of America Merrill Lynch (Akka.net)  Halo ( Project Orleans )
  • 7.
    Wofür verwende ichdas?  Alternative zu Threading  Message routing  State machines  CQRS / Event Driven Design  IoT  Singleton
  • 8.
    .net Entwicklung heute Service BLL DAO TelerikData Access DB DAO2 RestHandler WebApi
  • 9.
    Service BLL DAO Telerik Data Access DB DAO2 RestHandler WebApi Service BLL DAO TelerikData Access DB DAO2 RestHandler WebApi CPU 2 MSMQ Server 1 Server 2 Skalierung  Parallel LINQ  TPL – async/await  Threads  WCF  WebAPI  MSMQ / RabbitMQ / Azure Queues Elastic?
  • 10.
    ActorX ActorY ActorZCPU 2 Server 1Server 2 Skalierung mit akka.net Elastic! Akka.Actor Akka.Remote Akka.Cluster ActorX ActorY ActorZ
  • 11.
    Akka.net  Initial Entwickeltvon Roger Johansson und Aaron Stannard  OpenSource ( Apache 2 License )  Orientiert sich an den Features der JVM Akka Implementierung  ~ 5 core Entwickler  ~ 70 github contributor  Akka.net Version 1.0 – Q1/2015  Aktuell 1.04  C# und F# API  .net und Mono  ~ 50 mio msg/sec auf einer Maschine  ~ 2,5 millionen actors / GB RAM  Reactive Manifesto ( Responsive, Resilient, Elastic, Message Driven ) akka.net
  • 12.
    Wie funktioniert einActor? Quelle: http://getakka.net/docs/concepts/actors
  • 13.
    Actor Lifecycle Actor initializes Starting Actor isup and now able to process messages Receiving Actor cleans up Stopping Actor is dead Terminated Actor is going to restart Restarting PreStart() PostRestart() PreRestart() PostStop() PostStop()
  • 14.
    DispatcherThreadPool Actor1 Actor1 Actor2 Actor2Actor3 Actor4 Actor4 Actor1 Actor3 Actor4 Actor2 Actor1 Actor3 Actor2 Time  ThreadPoolDispatcher ( default, max concurrency )  TaskDispatcher ( TPL )  CurrentSynchronizationContextDispatcher ( UI sync )  …
  • 15.
    Demo Akka.Actor  HelloWorld  Actor System  ReceiveActor  ActorRef Server 1 ActorX ActorY ActorZ
  • 16.
    Demo Akka.Remote #1 Chat app  ActorSelection  RemoteActorRefProvider Akka.Remote ActorX ActorY ActorZ ActorX ActorY ActorZ
  • 17.
    Demo Akka.Remote #2 Remote deployment  Remote daemon Akka.Remote ActorX ActorY ActorZ ActorX ActorY ActorZ ActorA*
  • 18.
    Router  Leitet Nachrichtenan „routee“ Actors weiter  Group vs. Pool Router  RoundRobinRouter  ScatterGatherFirstCompletedRouter  BroadcastRouter  ConsistentHashingRouter  SmallestMailboxRouter  Elastische pools
  • 19.
    Router konfiguration akka.actor.deployment { /some-pool{ router = round-robin-pool nr-of-instances = 5 } } // Hocon config var router = system.ActorOf(Props.Create<Worker>().WithRouter(FromConfig.Instance), "some-pool"); // Code config var router = system.ActorOf(Props.Create<Worker>().WithRouter( new RoundRobinPool(5)), "some-pool");
  • 20.
  • 21.
  • 22.
    Elastische pools akka.actor.deployment { /my-router { router =round-robin-pool resizer { enabled = on lower-bound = 1 upper-bound = 10 messages-per-resize = 10 ramp-up-rate = 0.2 pressure-threshold = 1 backoff-threshold = 0.3 … } } }
  • 23.
    Demo Akka.Routing  RoundRobin Deployment configuration
  • 24.
    Supervision  Jeder Actorwird durch einen anderen Actor überwacht, welcher entscheidet, wie im Fehlerfall zu reagieren ist.  Restart  Teminate  Ignore and Resume  Escalate an eigenen Supervisor  Selbstheilung
  • 25.
    ErrorHandling – OneForOne Quelle:http://getakka.net/docs/concepts/supervision
  • 26.
    ErrorHandling – AllForOne Quelle:http://getakka.net/docs/concepts/supervision
  • 27.
    Error handling protected overrideSupervisorStrategy SupervisorStrategy() { return new OneForOneStrategy( // oder AllForOneStrategy maxNumberOfRetries: 10, duration: TimeSpan.FromSeconds(30), decider: x => { if (x is ArithmeticException) return Directive.Resume; else if (x is NotSupportedException) return Directive.Stop; else if (x is ArgumentOutOfRangeException) return Directive.Escalate; else return Directive.Restart; }); }
  • 28.
    Switchable Behavior private voidLebendig(){ …//other code if (this.lebenspunkte <= 0) this.Become(Tot); … } private void Tot(){ Receive<Wiederbeleben>(() => { this.lebenspunkte = this.maxLebenspunkte; this.Become(Lebendig); }); }
  • 29.
    Weitere Features  Cluster Cluster Sharding  Dependency Injection – Autofac  Persistence  Finite State Machines  F# API
  • 30.
    Wie gehts weiter? http://getakka.net/  https://github.com/akkadotnet/akka.net/tree/dev/src/examples  https://gitter.im/akkadotnet/akka.net  https://petabridge.com/bootcamp/ (kostenlos)  https://petabridge.com/
  • 31.
  • 32.
     http://www.dotnet-developer-conference.de/  30.November bis 02. Dezember 2015  Pullman Hotel Köln  Frühbucher  Bis 16. Oktober

Hinweis der Redaktion

  • #3 Welchen hintergrund haben die Leute? Web; Backend; Ui?
  • #5 Erlang: Netzwerk; Fail fast
  • #6 Getrennte Speicherbereiche; Eigener Thread vs. Multihreaded Concurrency Distributable by Design Location transparent OOP vs. Actor model Behavior Stateful Synchronous vs Asynchronous
  • #12 Resilient = Wiederstandsfähig
  • #13 Explain MailBox vs. Public API Behavior State Supervision Children ActorRef Transport: It doesn’t matter where the Actor lives. We just need the Actor ref
  • #15 The first free thread will be used by the actor Using a thread per actor would be too expensive Memory consumption wise 64bit system = 1 Thread = 4mb -> 1000 Threads = 4Gb 32bit system = 1mb / thread Actor consumes only CPU when it is processing
  • #17 Client 2 Client also possible since P2P (With ActorRef)
  • #18 RemoteDeployment: Example: Gather performance counter information on a remote system Remote Deploy project
  • #19 Group: Eigen definierte Routee Pool: System erstellte Routee Erkläre abgesetzte Router
  • #20 HOCON = Human-Optimized Config Object Notation
  • #21 RemoteRoundRobin ScaleUp and Out at the same time
  • #23 pressure-threshold = 1 // all have at least 1 msg backoff-threshold = 0.3 // less than 30% are busy messages-per-resize - The # of messages to route before checking if resize is needed
  • #24 Remote Deploy project: Config 2
  • #26 Explain Guardian User guardian Created by user System guardian Inside akka.net
  • #28 MaxNumberOfRetries: Wie oft wird die action versucht Duration: In welchem Zeitraum dürfen die Fehler auftreten
  • #29 Actor can decide how to handle next incoming message Super for state machines
  • #30 Persistence Journal -> in database for instance