40
Akka.NET Aktor basierte Programmierung in .NET

Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Akka.NETAktor basierte Programmierung in .NET

Page 2: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Taktfrequenzstagniert

zunehmendeAnzahl Kerne

CPU Entwicklung

Page 3: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Parallel ProgrammierungAufgabenstellung muss parallelisierbar sein

Kommunikation zwischen Ausführungs-Einheiten

Zugriff auf gemeinsame Ressourcen bzw. Daten regeln

Page 4: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Locks, Mutexe, SemaphorenKonflikt-Stelle wird durch einen "Lock" geschützt

eventuell warten andere Ausführungs-Einheiten auf Freigabe

Gefahr von Deadlocks

geringe Effizienz

Page 5: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Andere VerfahrenProblem: veränderliche Daten, gemeinsame Ressourcen

Funktionale Programmierung

Lambda Architektur

Channels, Streams

Actor Model

Page 6: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor ModellErfinder: Carl Hewitt 1973

Programmiersprachen: Erlang, Elixir, D, Scala, ...

Toolkits: Akka (JVM), Akka.NET Frameworks: Service Fabric, Orleans…

Page 7: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Reactive!„menschlich“, natürlich

auf Ereignisse reagieren

eventuell Umwege gehen

Veränderungen mitteilen

Page 8: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

http://reactivemanifesto.org/deAntwortbereit

Nachrichtenorientiert

Elastisch Widerstandsfähig

Page 9: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Reactive ManifestoAntwortbereit:unter allen Umständen antworten

Widerstandsfähig:bei Fehlern stabil bleiben

Elastisch:auch bei Last antwortbereit bleiben

Nachrichtenorientiert:entkoppelt, asynchrone Nachrichten

Page 10: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Was ist ein Aktor?Speicherungeines internen Zustandes

Verarbeitungeintreffender Nachrichten

Kommunikationmit anderen Aktoren

Page 11: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor HierarchieEigene Aktoren unter /user

„Eltern haften für ihre Kinder“ (guardian)

oben: Verantwortung, unten: Risiko

Erzeugen:

system.ActorOf(…)

Context.ActorOf(…)

Page 12: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor BestandteileAktor

Mailbox

Verhalten

Zustand

Überwachungs-Strategie

Kinder

1 2 3 4 5

Nachrichten -> Mailbox

sequentiell abarbeiten

immer nur ein Thread pro Aktor!

Page 13: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor VerhaltenZustandsautomatinitial: Receive

Umschalten:

Become(NeuerZustand);

Je nach Zustand anderes Verhalten

unerwartete Nachrichten: Fehler, verwerfen oder "aufschieben"

Page 14: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor ZustandAktor wird durch C# Klasse repräsentiert

Felder und Eigenschaften spiegeln Zustand wieder

Sobald Aktor „stirbt“: Zustand verlorenAusnahme: PersistentActor

Page 15: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Überwachungs Strategie"Eltern haften für ihre Kinder"

Optionen:

Resume: einfach weitermachen

Restart: neu starten (Standard)

Stop: anhalten

Escalate: an nächsthöhere Stelle melden

Page 16: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

KinderPfad: tiefer in Hierarchiez.B. /user/A --> /user/A/Kind

Überwachungsstrategie wählbar

Benachrichtigung beim Kind-Beenden

In Hierarchie navigierbarChild("name") / Children() / Parent

Page 17: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor SystemLaufzeitumgebung

/system, /user guardian

verwaltet Threads, steuert Aktoren

globale Dinge z.B. Log, EventStream

Steuerung via Konfiguration

Page 18: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor ansprechenniemals über Objekte! Ortsunabhängigkeit!

via ActorRef (zeig mir den Weg dorthin)z.B. akka.tcp://hello@host:8080/user/x

via ActorSelection Muster von Pfaden ala Terminal /user/x/*

über vordefinierte Methodenz.B. Context.System.EventStream

Page 19: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Nachrichten sendenwahlweise via ActorRef

actor.Tell("huhu");

actor.Tell(42L);

actor.Tell(new MessageClass(...));

oder via ActorSelection

Context.ActorSelection("x/*").Tell(...);

Page 20: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Nachrichten-TypenCommand: Imperativ

HandleMeasure / StoreSomething

Event: Vergangenheit

MeasureHandled / SomethingStored

Document: Substantiv

Measure / Something

Page 21: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Umdenken!ausschließlich asynchrone Nachrichten

"Tell – don't Ask"

Kein Zugriff auf Eigenschaften

alle ausgetauschten Objekte müssen unveränderlich sein!

lange Operationen vermeiden

Page 22: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Patternsca. 100 verzeichnet

Page 23: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor System in C#ActorSystem

anlegen

Actor

NuGet: Akka

Page 24: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Nachrichten verarbeitenBasisklasse

bestimmt Art der Verarbeitung

"Empfangs-bereitschaft"

Nachricht Typ

Verhalten. Lambda oder

Methodenaufruf

identisches Verhalten

identisches Verhalten

Page 25: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Aktor erzeugenProps: Argumente für Konstruktornotwendig wegen Ortsunabhängigkeit

Aktor erzeugen

Huhu – unsere erste Nachricht

wird an Konstruktor übergeben

Name in Hierarchie

Page 26: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

AnwendungsgebieteParallelisierung

Kommunikationsintensive Vorgänge

Realisierung von technischen Abläufen

Modellierung von Geschäftsprozessen

Verteilte Anwendungen

Page 27: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

ParallisierungAufteilung einer Aufgabe auf mehrere „Rechen-Aktoren“

dabei: parallele Verarbeitung

Resultat: schnell

Worker Worker Worker

Page 28: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Parallelisierung: RouterBerechnung Delegieren auf Router

Router entscheidet wer rechnet

Router leitet weiter, Worker antwortet

1

CalculatePi

4

double

Master

WorkerRouter3

CalculateRange

2

CalculateRange

WorkerWorker

via Forward

Page 29: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Parallelisierung: CodeWorker und Router anlegen:

Berechnung ausführen:

Page 30: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

KommunikationBeispiel Event Storming

Kollaboration

aus Chaos wird Ordnung

Jeder leistet seinen Anteil

Page 31: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Kommunikation: SudokuAngaben werden nacheinander bestückt

Zelle kennt ihren Inhalt und teilt ihn mit81 Aktoren

Zeile, Spalte und Block zählt Ziffern27 Aktoren

Summe: 108 Aktoren

Page 32: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Kommunikation: Lösen

Page 33: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

GeschäftsprozesseModellierung: Patterns von Domain-Driven Design

Realisierung: CQRS/ES

Schreibendes vs. lesendes Modell

Persistierung: Ereignisse

Wiederherstellung: Ereignis-Strom

Page 34: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

CQRS

© Martin Fowler

Page 35: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

CQRS/ES: CommandKommando wird validiert

Event wird persistiert (Event Sourcing)

Event wird angewandt

1

Command

Persistent Actor

2

Event

Persistent View

3

Event

Page 36: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

CQRS/ES: View aktualisierenpassende Events gelangen zum View

dadurch aktueller Zustand

Persistent Actor

Persistent View

2

Event

4

Event

Page 37: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

CQRS/ES: View abfragenVorhandene Daten

Abfrage preiswert

Persistent Actor

Persistent View

5

Query

6

Answer

Page 38: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

CQRS/ES: Actorunsere Basisklasse

Akka.Persistence definiert PersistentActorZustand

Schlüssel

KommandosEreignisse

Page 39: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

CQRS/ES: Actor AblaufDefinition

evtl. Validierung

Persistierung

Definition

Ausführung

Page 40: Akka - gi.de · Locks, Mutexe, Semaphoren Konflikt-Stelle wird durch einen "Lock" geschützt eventuell warten andere Ausführungs-Einheiten auf Freigabe Gefahr von Deadlocks

Akka.NET – Fazituniversell einsetzbares Toolkit

viele Einsatzgebiete

neue Muster

hohe Zuverlässigkeit

zukunftsträchtig