29
Christoph Knabe FB VI 21.06.2016 Reactive Programming Funktionale Programmierung

Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

  • Upload
    others

  • View
    26

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

Christoph KnabeFB VI21.06.2016

ReactiveProgramming

Funktionale Programmierung

Page 2: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 3: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 4: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 5: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 6: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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?

Page 7: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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?

Page 8: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 9: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 10: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 11: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 12: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 13: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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?

Page 14: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 15: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 16: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 17: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 18: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 19: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 20: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 21: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 22: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 23: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 24: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 25: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 26: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 27: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 28: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

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

Page 29: Reactive Programming - Beuth Hochschulepublic.beuth-hochschule.de/~knabe/fach/scala/mb... · Akka, Ratpack, Reactor, RxJava, Vert.x, DB-Treiber Wie Parallelität bewältigen? Beuth-Hochschule

Vielen Dank

Quellen: