• Keine Ergebnisse gefunden

Aktoren in Akka

N/A
N/A
Protected

Academic year: 2022

Aktie "Aktoren in Akka"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Reaktive Programmierung Vorlesung 11 vom 24.06.14: Actors in Akka

Christoph Lüth & Martin Ring Universität Bremen Sommersemester 2014

1 [16]

Fahrplan

I Teil I: Grundlegende Konzepte I Teil II: Nebenläufigkeit

IFutures and Promises

IReaktive Datenströme I

IReaktive Datenströme II

IFunktional-Reaktive Programmierung

IDas Aktorenmodell

IAktoren und Akka

I Teil III: Fortgeschrittene Konzepte

2 [16]

Rückblick

I Aktor Systeme bestehen aus Aktoren

I Aktoren

I haben eine Identität,

I haben ein veränderliches Verhalten und

I kommunizieren mit anderen Aktoren ausschließlich über unveränderliche Nachrichten.

3 [16]

Aktoren in Akka

traitActor {

typeReceive = PartialFunction[Any,Unit]

defreceive: Receive

implicit valcontext: ActorContext implicit final valself: ActorRef final def sender: ActorRef defpreStart()

defpostStop()

defpreRestart(reason: Throwable, message: Option[Any]) defpostRestart(reason: Throwable)

defsupervisorStrategy: SupervisorStrategy defunhandled(message: Any)

}

4 [16]

Aktoren Erzeugen

objectCount

class CounterextendsActor { varcount = 0

defreceive = {

caseCount ⇒count += 1 }

}

valsystem = ActorSystem("example") Global:

valcounter = system.actorOf(Props[Counter], "counter") In Aktoren:

valcounter = context.actorOf(Props[Counter], "counter")

5 [16]

Nachrichtenversand

objectCounter { objectCount;objectGet } classCounterextendsActor {

varcount = 0 defreceive = {

caseCounter.Count⇒count += 1 caseCounter.Get ⇒sender ! count }

}

valcounter = actorOf(Props[Counter],"counter") counter ! Count

“!” ist asynchron – Der Kontrollfluss wird sofort an den Aufrufer zurückggegeben.

6 [16]

Eigenschaften der Kommunikation

I Nachrichten die aus dem selben Aktor versendet werden kommen in der Reihenfolge des Versands an. (Im Aktorenmodell ist die Reihenfolge undefiniert)

I Abgesehen davon ist die Reihenfolge des Nachrichtenempfangs undefiniert.

I Nachrichten sollen unveränderlich sein. (Das kann derzeit allerdings nicht überprüft werden)

7 [16]

Verhalten

traitActorContext {

defbecome(behavior: Receive, discardOld: Boolean =true):

Unit

defunbecome(): Unit ...

}

classCounterextendsActor { defcounter(n: Int): Receive = {

caseCounter.Count⇒context.become(counter(n+1)) caseCounter.Get⇒sender ! n

}

defreceive = counter(0) }

Nachrichten werden sequenziell abgearbeitet.

8 [16]

(2)

Modellieren mit Aktoren

Aus “Principles of Reactive Programming” (Roland Kuhn):

I Imagine giving the task to a group of people, dividing it up.

I Consider the group to be of very large size.

I Start with how people with different tasks will talk with each other.

I Consider these “people” to be easily replaceable.

I Draw a diagram with how the task will be split up, including communication lines.

9 [16]

Beispiel

10 [16]

Aktorpfade

I Alle Aktoren haben eindeutige absolute Pfade. z.B.

“akka://exampleSystem/user/countService/counter1”

I Relative Pfade ergeben sich aus der Position des Aktors in der Hierarchie. z.B.“../counter2”

I Aktoren können über ihre Pfade angesprochen werden context.actorSelection("../sibling") ! Count context.actorSelection("../*") ! Count // wildcard

I ActorSelection6=ActorRef

11 [16]

Location Transparency und Akka Remoting

I Aktoren in anderen Aktorsytemen auf anderen Maschinen können über absolute Pfade angesprochen werden.

valremoteCounter = context.actorSelection(

"akka.tcp://otherSystem@214.116.23.9:9000/user/counter")

remoteCounter ! Count

I Aktorsysteme können so konfiguriert werden, dass bestimmte Aktoren in einem anderen Aktorsystem erzeugt werden

src/resource/application.conf:

> akka.actor.deployment {

> /remoteCounter {

> remote ="akka.tcp://otherSystem@127.0.0.1:2552"

> }

> }

12 [16]

Supervision und Fehlerbehandlung in Akka

I OneForOneStrategyvs.AllForOneStrategy class RootCounterextendsActor {

override defsupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10,

withinTimeRange = 1 minute) { case_: ArithmeticException ⇒Resume case_: NullPointerException ⇒Restart case_: IllegalArgumentException ⇒Stop

case_: Exception ⇒Escalate

} }

13 [16]

Aktorsysteme Testen

I Um Aktorsyteme zu testen müssen wir eventuell die Regeln brechen:

valactorRef = TestActorRef[Counter]

valactor = actorRef.underlyingActor I Oder: Integrationstests mitTestKit

"A counter"must {

"be able to count to three"in { valcounter = system.actorOf[Counter]

counter ! Count counter ! Count counter ! Count counter ! Get expectMsg(3) }

}

14 [16]

Event-Sourcing (Akka Persistence)

I Problem: Aktoren sollen Neustarts überleben, oder sogar dynamisch migriert werden.

I Idee: Anstelle des Zustands, speichern wir alle Ereignisse.

class CounterextendsPersistentActor { varcount = 0

defreceiveCommand = { caseCount ⇒

persist(Count)(_⇒count += 1) caseSnap ⇒saveSnapshot(count) caseGet⇒sender ! count }

defreceiveRecover = { caseCount ⇒count += 1

caseSnapshotOffer(_,snapshot: Int)⇒count = snapshot }

}

15 [16]

Zusammenfassung

I Unterschiede Akka / Aktormodell:

INachrichtenordnung wird pro Sender / Receiver Paar garantiert

IFutures sind keine Aktoren

IActorRefidentifiziert einen eindeutigen Aktor

IDie Regeln können gebrochen werden (zu Testzwecken) I Fehlerbehandlung steht im Vordergrund

I Verteilte Aktorensystem können per Akka Remoting miteinander kommunizieren

I Mit Event-Sourcing können Zustände über Systemausfälle hinweg wiederhergestellt werden.

16 [16]

Referenzen

ÄHNLICHE DOKUMENTE

Falls dieses Zeichen eine 1 ist, so l¨ osche es, gehe nach links, und wechsele in den Zustand q 3.. BuK/WS 2017 VL-02: Turing Maschinen

„...dann wäre es eine Chance für die Schweiz, sich in diesem Markt mit. Erfindungen und Technologien zu positionieren und damit

I Aktoren können über ihre Pfade angesprochen werden context.. Location Transparency und Akka Remoting. I Aktoren in anderen Aktorsytemen auf anderen Maschinen können über

I Aktorsysteme können so konfiguriert werden, dass bestimmte Aktoren in einem anderen Aktorsystem erzeugt

I Aktoren in anderen Aktorsytemen auf anderen Maschinen können über absolute Pfade angesprochen werden.. val remoteCounter = context. tcp

I Aktoren in anderen Aktorsytemen auf anderen Maschinen können über absolute Pfade angesprochen werden. val remoteCounter

I Aktorsysteme können so konfiguriert werden, dass bestimmte Aktoren in einem anderen Aktorsystem erzeugt

Passen Sie die Pfade an, so dass alle Bilder auf der Seite wieder