reactive programming - beuth hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · akka,...
Post on 22-May-2020
41 Views
Preview:
TRANSCRIPT
Christoph KnabeFB VI21.06.2016
ReactiveProgramming
Funktionale Programmierung
2Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Was ist Reactive Programming Geschichte der asynchronen Programmierung Wo bleibt die Zeit? Wartefreies Arbeiten Probleme von Threads Parallelitätswahn Das Aktorenmodell, Actor-Bibliotheken, Akka Ein Ping-Pong-Beispiel Nachrichten definieren, verarbeiten, senden ActorRef, ActorSystem, ActorContext, Scheduler Zusammenfassung
Inhalt
3Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Moderner Architekturstil● In Gartner: „Hype Cycle for Application Architecture”: 2014 → „On the Rise“, 2015 → „At the Peak“● Beschrieben in „The Reactive Manifesto“ V2 http://www.reactivemanifesto.org/
● Deutlich detaillierter in V1
Eigenschaften:● Responsive, kurze Antwortzeiten
● Resilient unverwüstlich, antwortet auch im Fehlerfall
● Elastic antwortet auch bei hoher Belastung
● Message Driven basiert auf asynchroner Nachrichtenübermittlung.
Was ist Reactive Programming
4Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Computer begannensynchronZuse 22 (1957):
● Befehle kamen direkt vom Trommelspeicher● 0,6ms pro Befehl (Int-Addition)● Kein Zeitverlust, wenn Befehle nur sequentiell● Zeitverlust Ø ½ Umdrehung = 9,6 ms bei Sprung
Geschichte: Synchrone Programmierung
5Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
CPU schnell, Ein/Ausgabe langsam
Wie CPU ausnützen?● Multiprogramming (LEO III, 1961) I/O-Wartezeiten überbrücken durch Context Switch
● Multi-Tasking (pdp-8, 1965) Mehrbenutzerbetrieb, unabhängige Prozesse, regelmäßiger Context Switch für Antwortzeitgarantie
Geschichte der asynchronen Programmierung
6Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Wartezeiten nach Peter NorvigLatency numbers every programmer should know: ● 0.5 ns L1 cache reference● 7 ns L2 cache reference● 100 ns Main memory reference● 150 µs SSD random read● 10 ms Hard Disk seek● 150 ms Send package US-CA → NL → CAPunktediagramm ansehen inhttps://gist.github.com/hellerbarde/2843375
Ausprobieren● ping java.sun.com
Wo bleibt die Zeit?
7Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Übersetzt in menschliche Dimensionen * 109
Würden Sie gern so lange warten? http://architects.dzone.com/articles/every-programmer-should-know
● 0.5 Sek. L1 cache reference● 7 Sek. L2 cache reference● 100 Sek. Main memory reference● 1,7 Tage SSD random read● 16,5 Wochen Disk seek● 4,8 Jahre Send package US-CA → NL → CA
Wie kann ich mir das vorstellen?
8Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Multi-Tasking (z.B. Unix)● Unabhängige Prozesse mit je eigenem Speicher● Kommunikation durch Mailboxen oder Dateisystem● Sicher, aber aufwändig (Speicher, Prozesswechsel)
Multithreading● In einem Prozess laufen mehrere Threads parallel.● Gemeinsamer Arbeitsspeicher und Dateideskriptoren● Eigener Registersatz und Call-Stack● Viel sparsamer als unabhängige Prozesse● Synchronisationsbedarf wegen gemeinsam genutzter Ressourcen.
Wartefreies Arbeiten
9Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
In Java parallele Programmierung mit Threads:● Thread = sequentieller Ablauffaden● parallele Ausführung mehrerer Threads● gemeinsame Daten müssen in synchronized-Objekt versteckt werden.● Folgt C.A.R. Hoare: „Monitors: An Operating System Structuring Concept“, 1974
Probleme:● Inkonsistenzen, wenn Zugriff auf gemeinsame Daten nicht synchronized läuft.
● Verlangsamung wegen Wartens auf synchronized-Objekt
● Deadlocks bei gegenseitigem Warten
● Starvation (Verhungern) bei ungerechtem Scheduling und mehreren Wartenden.
Viele Köche verderben den Brei
10Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Auf Java Servlet Platform (JEE):● Jeder Request erhält eigenen Thread.● Belegt diesen, bis die Antwort abgeliefert ist.● Also ca. 150 ms (≈ 5 Jahre!)● Davon das meiste Wartezeit!● Ein Thread belegt ca. 1 MB.
Parallelitätsbedarf:● Google: Wieviel Requests pro Sekunde?● Google-Antwortzeit? time wget http://www.google.de?q=semaphor
● Multiplizieren
Im Parallelitätswahn
11Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Beispiel Flugsuche:● Anfrage mit Zielort● Folgeanfrage bei Bahn● Warten auf Flughäfen● Folgeanfrage bei Fliegern● Warten auf Flüge● Antwort mit Flügen
Synchroner Ansatz (Threads):● Warten kaskadiert.
Asynchroner Ansatz:● Anfrage blockiert keine Ressourcen.
Diensteaggregation Verschärfung des Warteproblems
Flugsuche
12Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
kono.be/vivo:● Vielsprachige Terminologie-Anwendung● Sucht Übersetzungen und Artikel● Aggregiert zahlreiche Sprachsites● Oberfläche voll asynchron
http://kono.be/vivo/● Suchen z.B. nach Blog (en)
Eine reaktive Website
13Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Actor Model:● Nachrichtenbasiert
Futures (+ Promises):● Dienstaufruf liefert Future● Returniert sofort.● Ruft den Aufrufer mit Ergebnis (Callback).
Reactive Streams:● Modellierung von asynchronen Datenflüssen● Standard-Interfaces auf JVM● Implementierungen Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber
Wie Parallelität bewältigen?
14Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Monitor-Konzept kam aus Betriebssystemen. Aktorenmodell kam aus der Künstlichen Intelligenz
Carl Hewitt, Peter Bishop, Richard Steiger: A Universal Modular Actor Formalism for Artificial Intelligence, 1973
● höherwertige Abstraktion● kein geteilter Zustand
Aktor-Eigenschaften● Läuft parallel zu anderen Aktoren.● Reagiert auf Nachrichten sequentiell.● Kann Nachrichten versenden.● Kapselt eigenen Zustand.● Alle zusammen benötigen nur 1 Thread je CPU-Kern.● Frage: Wieviel Threads bzw. Actors können Sie im gleichen Arbeitsspeicher erzeugen?
Ein Aktor steht höher
15Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Act-1 (MIT, 1981, Henry Liebermann)● Jedes Objekt war ein Aktor.● Benutzt für Künstliche Intelligenz.
Erlang (Ericsson, 1987, Joe Amstrong)● Funktionale Sprache● Aktor ist Teil der Sprache.● Zustand nur im Aktor● Einsatz im Telekommunikationsbereich● Äußerst geringe Ausfallquote● Vorbild für Scala-Aktoren.
Aktor-Praxis
16Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Package scala.lang.actors● Zunächst einzige Aktor-Implementierung in Scala● Seit Scala 2.10 deprecated.
Lift Actors● Wurden im Web-Framework Lift wegen Performanz- problemen der scala.lang.actors eingeführt.● Sehr leichtgewichtig
Akka Actors● Populärste Scala-Aktor-Bibliothek● Mit Scala- und Java-API● Hierarchisches Aktor-Modell● Wenn Aktor ausfällt, Neustart durch Mutter-Aktor
Aktor-Bibliotheken in Scala
17Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Scala-Version festlegen:scalaVersion := "2.10.4"
Abhängigkeit von Akka-Aktoren angeben:libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.3.5")
Akka-Aktoren anfordern in build.sbt
18Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Ein Reflector soll Ping-Nachrichten verstehen:object Reflector { case class Ping(id: Int)}
Ein Reflector ist ein Actor:class Reflector extends Actor with ActorLogging
Ein Actor startet sofort nach Erzeugung.
Ein Actor darf Zustand haben:var count = 0
Wir wollen Ping-Pong spielen
19Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Er erhält seine Nachrichten sequentiell Nachrichtenverarbeitung wirkt wie Transaktionauf seinen Zustand:count += 1
Ein Actor lauscht auf Nachrichten mit receive:def receive: Receive = { case p: Ping => count += 1 log.debug(s"Received $p as #$count.")}
Typ Receive ist partielle Abbildung Any => Unit
Nachrichtenverarbeitung im Aktor
20Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Der Thrower muss wissen, wohin Ping senden:class Thrower(reflector: ActorRef) extends Actor with ActorLogging
Er soll 100 Ping-Nachrichten senden:for(i <- 1 to 100) { reflector ! Reflector.Ping(i)}
! sendet asynchron.Man nennt es den Bang-Operator.
Nachrichten senden
21Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Wir brauchen zuerst ein ActorSystem:Im ActorSystem leben die Aktoren.val system = ActorSystem("PingPong")
Erzeugen des parameterlosen Reflector-Aktors:val reflector: ActorRef = system.actorOf(Props[Reflector], "Reflector")
Erzeugen des parametrierten Thrower-Aktors:system.actorOf( Props(classOf[Thrower], reflector), "Thrower")
Aktoren erzeugen
22Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Nie Referenz auf ein Actor-Objekt weitergeben.Das ActorSystem muss die Fäden in der Hand behalten.val system = ActorSystem("PingPong")
Nicht warten im Actor:Kein Thread.sleep()!Keine Aufrufe von blockierenden Methoden wie in java.io oder traditionellen Datenbanktreibern!
Verzögerte Aktionen mit Scheduler einplanen.
Nur unveränderliche Objekte versenden!
Aktor-Regeln
23Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
ActorRef auf eigenen Actor liefern:selfBsp. Nachricht an sich selbst senden:self ! Nachricht(...)
ActorRef auf Absender-Actor liefern:senderBsp. Antwort an Absender senden:sender ! Antwort(...)
Kontext des Actors liefern:contextNur im aktuellen Aktor gültig!
Actor-Methoden im Trait Actor
24Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Das ActorSystem liefern:context.systemBsp. System herunterfahren:context.system.shutdown()
ActorRef auf Mutter-Actor liefern:context.parent
Aktuelles Verhalten durch neues ersetzen:context become newReceiveMethod
Tod eines anderen Aktors überwachen:context watch otherActorRef
Kontext-Methoden im Trait ActorContext
25Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Dient zum Einplanen von Nachrichtenlesen und Aktionen.Siehe http://doc.akka.io/docs/akka/2.3.5/scala/scheduler.html
Einmalige Nachricht an sich einplanen, Bsp.:import scala.concurrent.duration._ context.system.scheduler.scheduleOnce( 5.millis, self, "Shutdown")(context.dispatcher, self)
Regelmäßige Nachricht mittels schedule
Der Scheduler
26Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
In IDEA Projekt frp5scala öffnen
Klassen PingPongMain, Reflector, Thrower
PingPongMain mehrmals startenUndeterministisches Verhalten wegen Shutdown-Kommando nach 5 Millisekunden
Ping-Pong vorführen
27Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Reactive Systems:Schnelle, unverwüstliche, skalierbare Systeme basierend auf asynchronem Nachrichtenversand
Aktorenmodell:● Kein geteilter Zustand● mittels asynchronem Nachrichtenversand● Kein Warten, sondern bei Nachricht reagieren● gut parallelisierbar und skalierbar
Zusammenfassung
28Beuth-Hochschule für Technik Berlin University of Applied Sciences Christoph Knabe, 2016-06-21
Reactive Programming
Gartner-Analyse zum Hypecycle in Appl.Arch. 2014https://www.gartner.com/doc/2810117/hype-cycle-application-architecture-
Gartner-Analyse zum Hypecycle in Appl.Arch. 2015https://www.gartner.com/doc/3102217/hype-cycle-application-architecture-
The Reactive Manifesto V2http://www.reactivemanifesto.org/
Principles of Reactive Programminghttps://www.coursera.org/course/reactive
● MOOC der EPFL, jetzt Nachfolge: 5 Kurse● Futures, Actors, Reactive Streams● Sehr gute, aber harte Einführung
Quellen
Vielen Dank
Quellen:
top related