@alex0ptr
Worüber ich heute nicht rede… 🤐
Effizienz
Skalierung
non-Blocking I/O
message-driven
Aktoren
Resilience
Reaktive Systeme
Reactive Manifesto
@alex0ptr
Worüber wir heute reden.
Wie sieht das im Einsatz aus?
Was ist Reaktive Programmierung?
Wo liegt der Nutzen?
@alex0ptr
Was ist Reaktive Programmierung? 🤔
@alex0ptr
Ganz am Anfang:
Functional Reactive Programming🧐🎓
@alex0ptr
Functional Reactive Programming
1. reaktive Produzenten
2. reaktive Deklaration
3. automatische Propagierung
@alex0ptr
Reactive Producers
Behaviours, Signals
‣ (zeit-)kontinuerlich sich ändernde Werte
‣ erzeugen Wertänderungen
Events, Streams, Sequences (of Events)
‣ zeitdiskret, potentiell nicht endlich
‣ erzeugen Ereignisse
@alex0ptr
Demo
@alex0ptr
Das tut mir jetzt mehr weh als euch! 😬
Dependency Graph ⚙
a = 1
b = 2
c = a + b
“a = 2”
=> “c == 4”
@alex0ptr
a b
c
Was ist Reaktive Programmierung? ✔
“was” (deklarativ) anstatt “wann”, “wie” (Reihenfolge,
Abhängigkeiten)
@alex0ptr
Wo liegt der Nutzen? 🤔
@alex0ptr
Alternativen:
Observer Pattern und Callbacks
@alex0ptr
Alternativen:
Observer Pattern und Callback-😈🔥
@alex0ptr
Beispiel: Linie zeichnen
@alex0ptr
Maier and Odersky “Deprecating the Observer Pattern with Scala.React”
@alex0ptr
Seiteneffekte
Kapselung
Komposition
Resourcen Management
Separation of Concerns
Semantische Distanz
Uniformität
Abstraktion
Datenkonsistenz
var path: Path = null
val moveObserver = { (event: MouseEvent) !=> path.lineTo(event.position) draw(path) }
control.addMouseDownObserver { event !=> path = new Path(event.position) control.addMouseMoveObserver(moveObserver) }
control.addMouseUpObserver { event !=> control.removeMouseMoveObserver(moveObserver) path.close() draw(path) }
Ausblick
@alex0ptr
app.mouseDown() .map(position !-> new Line(position, position)) .flatMap(line !-> app.mouseMove() .takeUntilOther(app.mouseUp()) .map(position !-> new LineEndChanged(line, position))) .subscribe(Examples!::updateLine); !// side effects
@alex0ptr
Verständlichkeit.
Zeichen der Zeit 🗞
‣ Frontend, Mobile, Desktop, Backend
‣ Technology Radar: “ADOPT” ReactiveX
‣ Java 9: JEP 266, Observable
‣ Spring 5: Reactor + WebFlux
@alex0ptr
Wie sieht das im Einsatz aus? 🤔
@alex0ptr
Praxisrelevante (JVM) Lösungen
@alex0ptr
@alex0ptr
ReactiveX
@alex0ptr
RxJava
RxJS
Rx.NET
RxScala
RxSwift
etc.
@alex0ptr
Reactor
Reactive Streams
@alex0ptr
“…is an initiative to provide a standard for asynchronous
stream processing with non-blocking backpressure.”
Ratpack Play Framework
ElasticSearch
Akka Streams
MongoDB
Vert.x
RxJava
Redis
Slick
ReactorCassandra
Spring
Micronaut
Reactive Streams
@alex0ptr
public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete(); }
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {}
public interface Subscription { public void request(long n); public void cancel(); }
Backpressure
@alex0ptr
💪 💪
Backpressure
@alex0ptr
💪 😰
Backpressure
@alex0ptr
💪 😎✋4
🎊 Demo 🎉
@alex0ptrhttps://github.com/alex0ptr/reactive-talk
xing.com/companies/qawaregmbh
linkedin.com/company/qaware-gmbh slideshare.net/qaware
twitter.com/qaware github.com/qaware
youtube.com/qawaregmbh
Alex Krause
@alex0ptr
QAware GmbH Mainz
Rheinstraße 4 D
55116 Mainz
Tel.: +49 (0) 6131 215 69 – 0
Fax: +49 (0) 6131 215 69 – 68 xing.com/companies/qawaregmbh
linkedin.com/company/qaware-gmbh slideshare.net/qaware
twitter.com/qaware github.com/qaware
youtube.com/qawaregmbh
QAware GmbH München
Aschauer Straße 32
81549 München
Tel.: +49 (0) 89 23 23 15 – 0
Fax: +49 (0) 89 23 23 15 – 129 xing.com/companies/qawaregmbh
linkedin.com/company/qaware-gmbh slideshare.net/qaware
twitter.com/qaware github.com/qaware
youtube.com/qawaregmbh