CTO bei der Accso – Accelerated Solutions GmbH in Darmstadt www.accso.de Seit Ende der 90er Jahre in Projekten für Individualentwicklung, v.a. als Technischer Architekt und Berater Schwerpunkte: Java, SW-Architektur, Entwicklungsmethodik, Verteilte Systeme Aktive Mitarbeit im iSAQB jfs2015:~ # who am i
minimale Latenz, hoher Durchsatz Anforderungen an Skalierbarkeit: steigende Nutzerzahlen, Multi-Core Anforderungen an Verfügbarkeit: 24x7, Failover, hohe Fehlertoleranz Was sind die Anforderungen? Forderungen des Reactive Manifesto: Responsive, Resilient, Elastic, Message-Driven Event-basiert Viele parallele Requests Viele Abnehmer Pipelining, Verarbeitungsketten
ist komplex: Kompliziert und damit fehleranfällig! Reactor Pattern Weitere Anforderung: Beherrschbarkeit der Komplexität „Altbekannte“ Nebenläufigkeitsprogrammierung nutzt i.d.R. Ressourcen nicht optimal aus. LMAX Disruptor
für nebenläufige Programmierung Aktoren sind die ausführbaren Einheiten im System Shared-Nothing-Architektur (kein globaler Zustand) Kommunikation nur über asynchrones Messaging Aktor Aktor Aktor State State State
Laufzeitumgebung Vert.x Modul Event-Bus Verticle Verticle Verticle A Verticle Verticle Verticle Verticle B Verticle Verticle A Verticle Verticle Verticle C Shared Data Shared Data Event Loop Threads Event Loop Threads Browser Java- script SockJS Clustering (Hazelcast) Clustering (Hazelcast) Die Baustein-Architektur von Vert.x
Laufzeitumgebung Event Loop Thread 1 Event Loop Thread 2 Event Loop Thread 3 Event Loop Thread 4 Zeit Verticle A Verticle B Verticle A Verticle C Verticle D Verticle E Verticle F Verticle F Verticle G Verticle H
Laufzeitumgebung Event Loop Thread 1 Event Loop Thread 2 Event Loop Thread 3 Event Loop Thread 4 Zeit Verticle A Verticle B Verticle A Verticle C Verticle D Verticle E Verticle F Verticle F Verticle G Verticle H Verticles werden immer auf demselben ELT ausgeführt! Keine parallele Ausführung! Programmiermodell = single-threaded Blockierung vermeiden! Wenn G blockiert, verhungert H! Langläufige und blockierende Operationen in spezielle Worker- Verticles auslagern! (separater Thread-Pool) Jedes Verticle hat eigenen Classloader. Kein Shared State!
Juni 2015 Verticles sind nun (potentiell) verzichtbar Modulsystem ist umgebaut Trennung in Core und Web Asynchrone DB-Zugriffe (JDBC, MongoDB, …) Integration von Mail, JCA, Cloud, Docker, … Authentifizierung und Autorisierung Neues Unit-Test-Framework Metriken Cluster-Manager austauschbar Bus-Serialisierung austauschbar Reactive: Rx und Reactive Streams 3.0 Erst mit 3.1
Beeinflusst durch: Reactor Pattern, Java 8 Streams Open- Source Reactor-Framework im Überblick polyglott Optimiert auf Performance u. Durchsatz … foundational library for reactive fast data applications
Reactor Nimmt Events von Produzenten entgegen Heisst Event-Bus ab Version 2 Dispatcher Scheduling und Routing von Events Nutzt Thread-Pool, Ringbuffer, je nach Konfiguration Selector Bestimmt die Adressaten eines Events Adressierung über Strings, Objekttyp, Regulären Ausdruck, … Consumer Verarbeitet Events Bus-API oder alternativ Stream-API
Callback-Hölle Problem 1: Callback-Hölle public class PingVerticle extends Verticle { @Override public void start() { Handler<Message<String>> handler = new Handler<Message<String>>() { public void handle(Message<String> message) { vertx.setTimer(1000, new Handler<Long>() { public void handle(Long event) { ... } }); } };
Rüdiger Grammes, Martin Lehmann, Dr. Kristine Schaal Gut verknotet - Vert.x im Einsatz für hochskalierbare Architekturen PDF: http://goo.gl/j4zyb0 Dr. Rüdiger Grammes, Martin Lehmann, Dr. Kristine Schaal Reaktive Anwendungen mit dem Reactor-Framework http://heise.de/-2405139